【问题标题】:python get groups of combinations that each member appear only oncepython获取每个成员只出现一次的组合组
【发布时间】:2019-01-15 13:57:47
【问题描述】:

我正在尝试获取每个成员仅出现一次的排列/组合组 (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]}...]

我想知道该案例的术语是什么,以及是否已经实施了该案例。

谢谢。

【问题讨论】:

  • 您是否尝试过使用 itertools.product() 然后根据您的需要进行分组?

标签: python numpy combinations permutation


【解决方案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)) 用于所有可能的组合。

【讨论】:

  • 太棒了!对于使用 (len(arr)/2) 作为组的期望大小的一般情况,我使用此解决方案来解决我的问题。我设置了一个附加条件来支持“c”处奇数个元素的大小写。在这种情况下,我可以假设第二个组合列表中将缺少其中一个元素。
【解决方案2】:

您可以找到最多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']]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多