我想使用itertools的组合方法以列表列表的形式获取列表的所有组合

时间:2018-07-29 10:27:18

标签: python python-3.x combinations itertools

我尝试过

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]....]

1 个答案:

答案 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)