我有3位玩家的名单:
[1, 2, 3]
如何在python中生成以下形式的列表列表:
[[1], [2], [3], [1,2], [1,3], [2,3], [1,2,3]]
代表可以与以上球员组成的所有球队吗?
答案 0 :(得分:2)
您可以使用itertools.combinations()
,在其中可以将r
参数设置为从1到列表长度(x
)的所有长度,以获取将要展平的所有可能组合在列表理解中。
from itertools import combinations
x = [1, 2, 3]
result = [c for i in range(1, len(x)+1) for c in combinations(x, i)]
print(result) # -> [(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
答案 1 :(得分:2)
使用https://docs.python.org/3/library/itertools.html#itertools.combinations
它确实满足您的需求。
import itertools
players = [1, 2, 3]
print(list(itertools.chain.from_iterable(itertools.combinations(players, r) for r in range(1, len(players) + 1))))
输出:
[(1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
由于使用了itertools.chain,这可能是最有效的答案
答案 2 :(得分:1)
您可以使用具有特定大小的itertools.combinations
来生成固定大小的组合。为了概括起见,您可以对所有大小使用for循环。代码如下:
import itertools
my_list = [1, 2, 3]
for L in range(0, len(my_list)+1):
for subset in itertools.combinations(my_list, L):
print(subset)
答案 3 :(得分:0)
您可以使用itertools
。您要做的是生成给定列表的功率集。
>>> import itertools
>>> a=[1,2,3]
>>> out=[]
>>> for i in range(len(a)+1):
out+=list(itertools.combinations(a,i))
>>> out
[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)]
>>>
您可以编写recursive
函数来生成功率集,如下所示:
>>> def powerset(s,idx,curr,out):
if idx==len(s):
out.append(curr)
return
(powerset(s,idx+1,curr+[s[idx]],out))
(powerset(s,idx+1,curr,out))
return sorted(out,key=lambda x:len(x))
>>> z=powerset(a,0,[],[])
>>> z
[[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]
答案 4 :(得分:0)
Itertools是您进行此类操作的朋友:
import itertools
l = [1, 2, 3]
l = [list(x) for y in range(1,len(l)+1) for x in itertools.combinations(l,y) ]
print(l)
礼物:
[[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]