获取列表的组合而无需在Python中进行替换

时间:2018-09-30 06:24:30

标签: python python-3.x

我有一个人员列表,我想将他们的团队(共3个)彼此组合在一起。

list_of_ppl = ['A','B','C','D','E','F']

我需要的是:

>>> [['A','B','C'],['D','E','F']]
>>> [['A','B','D'],['C','E','F']]
>>> [['A','B','E'],['C','D','F']]
>>> [['A','B','F'],['C','D','E']]
>>> [['A','C','E'],['B','D','F']]
>>> and so on...

编辑: len(list_of_ppl)可以大于6,并且可以是不能被3整除的数字。我只需要3

的团队

例如:

list_of_ppl = ['A','B','C','D','E','F','G']
>>> [['A','B','C'],['D','E','F'],['G']]
>>> [['A','B','D'],['C','E','G'],['F']]
>>> [['A','B','D'],['C','F','G'],['E']]
>>> [['A','B','F'],['C','E','G'],['D']]
>>> [['A','E','G'],['B','D','F'],['C']]
>>> and so on...

3 个答案:

答案 0 :(得分:2)

您可以使用递归函数从其余人员列表中继续获取3的组合,直到列表用尽:

arr2 = [[1, 2, 3], [4, 5, 6]]
arr3 = [[1, 2], [2, 4], [5, 8]]
matrix_multiply(arr2, arr3)

[[None, None], [None, None]]
i: 0 j: 0 k: 0
i: 1 j: 0 k: 0
i: 2 j: 0 k: 0
20
j: 0 k: 0
[[20, None], [20, None]]
i: 0 j: 0 k: 1
i: 1 j: 0 k: 1
i: 2 j: 0 k: 1
34
j: 0 k: 1
[[20, 34], [20, 34]]
i: 0 j: 1 k: 0
i: 1 j: 1 k: 0
i: 2 j: 1 k: 0
44
j: 1 k: 0
[[44, 34], [44, 34]]
i: 0 j: 1 k: 1
i: 1 j: 1 k: 1
i: 2 j: 1 k: 1
76
j: 1 k: 1
[[44, 76], [44, 76]]
[[44, 76], [44, 76]]

因此使用class GroupAdminForm(forms.ModelForm): class Meta: model=group exclude=[] users=forms.ModelMultipleChoiceField(queryset=User,objects.all(),widget=FilteredSelectMultiple('users',False),required=False) def __int__(self,*args,**kwargs): super(GroupAdminForm,self).__int__(*args,**kwargs) if self.instance.pk: self.fields['users'].initial=self.instance.user_set.all() def save_m2m(self): self.instance.user_set.set(self.cleaned_data['users']) def save(self,*args,*kwargs): instance= super(GroupAdminForm,self).save() self.save_m2m() return instance 时,将输出:

from itertools import combinations
def get_teams(list_of_ppl, size=3):
    if len(list_of_ppl) > size:
        for team in combinations(list_of_ppl, size):
            for teams in get_teams(list(set(list_of_ppl) - set(team))):
                yield [list(team), *teams]
    else:
        yield [list_of_ppl]
for team in get_teams(list_of_ppl):
    print(team)

或带有list_of_ppl = ['A','B','C','D','E','F']且长度不能被3整除的[['A', 'B', 'C'], ['F', 'E', 'D']] [['A', 'B', 'D'], ['C', 'F', 'E']] [['A', 'B', 'E'], ['C', 'F', 'D']] [['A', 'B', 'F'], ['C', 'E', 'D']] [['A', 'C', 'D'], ['F', 'B', 'E']] [['A', 'C', 'E'], ['F', 'B', 'D']] [['A', 'C', 'F'], ['B', 'E', 'D']] [['A', 'D', 'E'], ['C', 'B', 'F']] [['A', 'D', 'F'], ['C', 'B', 'E']] [['A', 'E', 'F'], ['C', 'B', 'D']] [['B', 'C', 'D'], ['E', 'F', 'A']] [['B', 'C', 'E'], ['F', 'A', 'D']] [['B', 'C', 'F'], ['E', 'A', 'D']] [['B', 'D', 'E'], ['C', 'F', 'A']] [['B', 'D', 'F'], ['C', 'A', 'E']] [['B', 'E', 'F'], ['C', 'A', 'D']] [['C', 'D', 'E'], ['F', 'B', 'A']] [['C', 'D', 'F'], ['E', 'B', 'A']] [['C', 'E', 'F'], ['B', 'A', 'D']] [['D', 'E', 'F'], ['C', 'B', 'A']] ,将输出:

list_of_ppl

答案 1 :(得分:1)

使用combinations中的itertools

from itertools import combinations
list(map(list,combinations(list_of_ppl,3)))

[['A', 'B', 'C'],
 ['A', 'B', 'D'],
 ['A', 'B', 'E'],
 ['A', 'B', 'F'],
 ['A', 'C', 'D'],
 ['A', 'C', 'E'],
 ['A', 'C', 'F'],
 ['A', 'D', 'E'],
 ['A', 'D', 'F'],
 ['A', 'E', 'F'],
 ['B', 'C', 'D'],
 ['B', 'C', 'E'],
 ['B', 'C', 'F'],
 ['B', 'D', 'E'],
 ['B', 'D', 'F'],
 ['B', 'E', 'F'],
 ['C', 'D', 'E'],
 ['C', 'D', 'F'],
 ['C', 'E', 'F'],
 ['D', 'E', 'F']]

或者:

l = list(map(list,combinations(list_of_ppl,3)))
list(map(list,zip(l[::2],l[::-1][::2])))

[[['A', 'B', 'C'], ['D', 'E', 'F']],
 [['A', 'B', 'E'], ['C', 'D', 'F']],
 [['A', 'C', 'D'], ['B', 'E', 'F']],
 [['A', 'C', 'F'], ['B', 'D', 'E']],
 [['A', 'D', 'F'], ['B', 'C', 'E']],
 [['B', 'C', 'D'], ['A', 'E', 'F']],
 [['B', 'C', 'F'], ['A', 'D', 'E']],
 [['B', 'D', 'F'], ['A', 'C', 'E']],
 [['C', 'D', 'E'], ['A', 'B', 'F']],
 [['C', 'E', 'F'], ['A', 'B', 'D']]]

或者:

list(map(list,zip(l,l[::-1])))

[[['A', 'B', 'C'], ['D', 'E', 'F']],
 [['A', 'B', 'D'], ['C', 'E', 'F']],
 [['A', 'B', 'E'], ['C', 'D', 'F']],
 [['A', 'B', 'F'], ['C', 'D', 'E']],
 [['A', 'C', 'D'], ['B', 'E', 'F']],
 [['A', 'C', 'E'], ['B', 'D', 'F']],
 [['A', 'C', 'F'], ['B', 'D', 'E']],
 [['A', 'D', 'E'], ['B', 'C', 'F']],
 [['A', 'D', 'F'], ['B', 'C', 'E']],
 [['A', 'E', 'F'], ['B', 'C', 'D']],
 [['B', 'C', 'D'], ['A', 'E', 'F']],
 [['B', 'C', 'E'], ['A', 'D', 'F']],
 [['B', 'C', 'F'], ['A', 'D', 'E']],
 [['B', 'D', 'E'], ['A', 'C', 'F']],
 [['B', 'D', 'F'], ['A', 'C', 'E']],
 [['B', 'E', 'F'], ['A', 'C', 'D']],
 [['C', 'D', 'E'], ['A', 'B', 'F']],
 [['C', 'D', 'F'], ['A', 'B', 'E']],
 [['C', 'E', 'F'], ['A', 'B', 'D']],
 [['D', 'E', 'F'], ['A', 'B', 'C']]]

for v in list(map(list,zip(l,l[::-1]))):
    print(v)

[['A', 'B', 'C'], ['D', 'E', 'F']]
[['A', 'B', 'D'], ['C', 'E', 'F']]
[['A', 'B', 'E'], ['C', 'D', 'F']]
[['A', 'B', 'F'], ['C', 'D', 'E']]
[['A', 'C', 'D'], ['B', 'E', 'F']]
[['A', 'C', 'E'], ['B', 'D', 'F']]
[['A', 'C', 'F'], ['B', 'D', 'E']]
[['A', 'D', 'E'], ['B', 'C', 'F']]
[['A', 'D', 'F'], ['B', 'C', 'E']]
[['A', 'E', 'F'], ['B', 'C', 'D']]
[['B', 'C', 'D'], ['A', 'E', 'F']]
[['B', 'C', 'E'], ['A', 'D', 'F']]
[['B', 'C', 'F'], ['A', 'D', 'E']]
[['B', 'D', 'E'], ['A', 'C', 'F']]
[['B', 'D', 'F'], ['A', 'C', 'E']]
[['B', 'E', 'F'], ['A', 'C', 'D']]
[['C', 'D', 'E'], ['A', 'B', 'F']]
[['C', 'D', 'F'], ['A', 'B', 'E']]
[['C', 'E', 'F'], ['A', 'B', 'D']]
[['D', 'E', 'F'], ['A', 'B', 'C']]

答案 2 :(得分:0)

内置的itertools具有帮助功能。 itertools.combinations

see doc

  

itertools.combinations(iterable,r)

     

从可迭代输入中返回元素的r长度子序列。

     

组合按字典顺序排序。因此,如果对输入> iterable进行排序,则将按排序顺序生成组合元组。

     

根据元素的位置而不是其值将元素视为唯一。因此,如果输入元素是唯一的,则每个组合中将没有重复值。