我尝试过
import itertools
a=[10, 1 ,2, 7, 6, 1, 5]
b=[]
for i in range(len(a)):
for s in itertools.combinations(a,i):
if s not in b:
b.append(s)
print(b)
我正在以元组的形式获得所需的输出。我想要的输出如下:
[[10],[1],...[10,1],...[10,1,2]....]
答案 0 :(得分:2)
itertools
中的大多数函数都产生tuple
,但是好消息是,元组是可迭代的,您可以将list(..)
与可迭代的对象一起使用,以将可迭代的对象转换为列表
因此,我们可以例如map
迭代工具的结果,例如:
from itertools import combinations
a=[10, 1 ,2, 7, 6, 1, 5]
b=[]
for i in range(len(a)):
for s in map(list, combinations(a,i)):
if s not in b:
b.append(s)
print(b)
但是,这仍然不是一个好主意。列表的成员资格检查以线性时间运行。由于组合的数量呈指数级,这意味着它将在 O((n!) 2 )时间开始运行,并以 n 元素的数量,通常非常慢。
一种更快的方法是同时使用set
来存储元素,然后每次检查元组的成员资格(set
不能包含list
s ,因为list
是不可散列的),如果成员资格失败,我们将其作为列表添加到b
中:
from itertools import combinations
a=[10, 1 ,2, 7, 6, 1, 5]
b=[]
seen = set()
for i in range(len(a)):
for s in combinations(a,i):
if s not in seen:
seen.add(s)
b.append(list(s))
print(b)