我正在尝试获取每个成员仅出现一次的排列/组合组(r = 2)
我使用python'combinations'软件包进行组合。
例如:成员是: a,b,c,d。 组合为: [a,b],[a,c],[a,d],[b,c],[b,d] ...
我想要的输出是: [{[a,b],[c,d]},{[a,c],[b,d]},{[a,d],[b,c]} ...] < / em>
我想知道这种情况的用语以及是否已经实现了该用语。
谢谢。
答案 0 :(得分:1)
这是一种方法:
from itertools import combinations, chain
l = ['a','b','c','d']
c = list(combinations(l,2))
[set(i) for i in list(combinations(c,2)) if (len(set(l) & set(chain(*i))) == len(l))]
[{('a', 'b'), ('c', 'd')}, {('a', 'c'), ('b', 'd')}, {('a', 'd'), ('b', 'c')}]
说明
您可以使用itertools.combinations
两次,以便从以下位置获取所有2个元组组合:
list(combinations(l,2))
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
对于每种可能的组合,仅选择元素集与原始列表len(set(l) & set(chain(*i))) == len(l))
相交的元素。
答案 1 :(得分:0)
您最多可以找到r
的排列,然后过滤结果:
def combinations(d, d1, r, _c = [], _start=[]):
if len([i for b in _c for i in b]) == len(d1):
yield _c
else:
for i in d:
if i not in _start:
if len(_start+[i]) < r:
yield from combinations(d, d1, r, _c, _start=_start+[i])
else:
_d = sorted(_start+[i])
yield from combinations([i for i in d if i not in _d], d1,r, _c+[_d], [])
data = ['a', 'b', 'c', 'd']
_r = list(combinations(data, data, 2))
new_d = [a for i, a in enumerate(_r) if a not in _r[:i]]
输出:
[[['a', 'b'], ['c', 'd']], [['a', 'c'], ['b', 'd']], [['a', 'd'], ['b', 'c']], [['b', 'c'], ['a', 'd']], [['b', 'd'], ['a', 'c']], [['c', 'd'], ['a', 'b']]]