Если вам не нравится этот пустой кортеж в начале, вы можете просто изменить range оператор на range(1, len(s)+1), чтобы избежать комбинации длиной 0.
Ответ 2
Вот еще код для powerset. Это написано с нуля:
>>> defpowerset(s): ... x = len(s) ... for i inrange(1 << x): ... print [s[j] for j inrange(x) if (i & (1 << j))] ... >>> powerset([4,5,6]) [] [4] [5] [4, 5] [6] [4, 6] [5, 6] [4, 5, 6]
Здесь применим комментарий Марка Рушакова: "Если вам не нравится этот пустой кортеж в начале, вкл."вы можете просто изменить оператор range на range(1, len(s) + 1), чтобы избежать комбинации длиной 0", за исключением того, что в моем случае вы меняете for i in range(1 << x) на for i in range(1, 1 << x).
Возвращаясь к этому годы спустя, я бы сейчас написал это так:
defpowerset(s): x = len(s) masks = [1 << i for i inrange(x)] for i inrange(1 << x): yield [ss for mask, ss inzip(masks, s) if i & mask]
И тогда тестовый код будет выглядеть так, скажем:
print(list(powerset([4, 5, 6])))
Использование yield означает, что вам не нужно вычислять все результаты в одном фрагменте памяти. Предполагается, что предварительное вычисление масок вне основного цикла является полезной оптимизацией.
defpowerset(seq): """ Returns all the subsets of this set. This is a generator. """ iflen(seq) <= 1: yield seq yield [] else: for item in powerset(seq[1:]): yield [seq[0]]+item yield item
Это можно использовать следующим образом:
l = [1, 2, 3, 4] r = [x for x in powerset(l)]
Теперь r представляет собой список всех элементов, которые вы хотели, и может быть отсортирован и распечатан: