一个人如何从一个列表中生成所有可能的玩家团队?

时间:2020-01-15 15:11:51

标签: python python-3.x numpy

我有3位玩家的名单:

[1, 2, 3]

如何在python中生成以下形式的列表列表:

[[1], [2], [3], [1,2], [1,3], [2,3], [1,2,3]]

代表可以与以上球员组成的所有球队吗?

5 个答案:

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