Как можно создать все возможные команды игроков из списка? - PullRequest
1 голос
/ 15 января 2020

У меня есть список, скажем, 3 игроков:

[1, 2, 3]

Как я могу создать в python список списков в форме:

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

представляет все команды, которые могут быть сформированы с вышеуказанными игроками?

Ответы [ 5 ]

2 голосов
/ 15 января 2020

Вы можете использовать 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)]
2 голосов
/ 15 января 2020

Использование https://docs.python.org/3/library/itertools.html#itertools .комбинации

Это именно то, что вы хотите.

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

1 голос
/ 15 января 2020

Вы можете использовать itertools.combinations с заданным размером для создания комбинаций фиксированного размера. Чтобы обобщить, вы можете просто использовать для l oop для всех размеров. Код будет выглядеть так:

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)
0 голосов
/ 15 января 2020

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]]
0 голосов
/ 15 января 2020

Вы можете использовать itertools. То, что вы хотите сделать, это сгенерировать powerset из данного списка.

>>> 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 функцию для генерации powerset следующим образом:

>>> 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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...