Если вы не довольны itertools
, вы можете использовать понимание списка.
>>> xs = [1,3,5,-1]
Если вы пронесете xs
со всеми своими подсписками, начиная с индекса 1, 2, ..., len (xs) -1, вы получите все комбинации:
>>> [list(zip(xs,xs[n:])) for n in range(1,len(xs))]
[[(1, 3), (3, 5), (5, -1)], [(1, 5), (3, -1)], [(1, -1)]]
(Обратите внимание, что я обернул здесь zip
в list
для лучшего вывода.)
Теперь вы должны сгладить список кортежей. Это просто понимание списка с каждым кортежем каждого списка кортежей, полученного с помощью zip
:
>>> [t for ys in [zip(xs,xs[n:]) for n in range(1,len(xs))] for t in ys]
[(1, 3), (3, 5), (5, -1), (1, 5), (3, -1), (1, -1)]
Вы хотите отсортированные кортежи: это tuple(sorted(t))
, потому что отсортированный возвращает список. Поместите все в set
, чтобы удалить дубликаты.
>>> set(tuple(sorted(t)) for ys in [zip(xs,xs[n:]) for n in range(1,len(xs))] for t in ys)
{(-1, 1), (1, 3), (-1, 3), (1, 5), (-1, 5), (3, 5)}
(Вы также можете, как это сделал silkworm, отсортировать список перед выводом кортежей.) Другие тестовые случаи:
>>> xs = [1,1,1,1]
>>> set(tuple(sorted(t)) for ys in [zip(xs,xs[n:]) for n in range(1,len(xs))] for t in ys)
{(1, 1)}
>>> xs = [1,1,5,5]
>>> set(tuple(sorted(t)) for ys in [zip(xs,xs[n:]) for n in range(1,len(xs))] for t in ys)
{(1, 5), (5, 5), (1, 1)}
Совет: вы должны использовать itertools
...