关于python:我想使用itertools的组合方法以列表的形式获得列表的所有组合

I want to get all combination of a list in form of a list of list using combinations method of itertools

我试过这个

1
2
3
4
5
6
7
8
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)

我正在以元组的形式获得所需的输出。我希望输出如下:

1
[[10],[1],...[10,1],...[10,1,2]....]


itertools中的大多数函数都会生成tuple,但好消息是,元组是一个不可数,您可以使用带有不可数的list(..)将不可数转换为一个列表。

因此,我们可以例如map对itertools的结果,例如:

1
2
3
4
5
6
7
8
9
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,因为list是不可更改的),如果成员身份失败,我们将其作为列表添加到b中:

1
2
3
4
5
6
7
8
9
10
11
12
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)