获取可以从python中的列表形成的所有互斥对的最快方法? [复制]

Posted

技术标签:

【中文标题】获取可以从python中的列表形成的所有互斥对的最快方法? [复制]【英文标题】:Fastest way to get sets of all mutually exclusive pairs that can be formed from a list in python? [duplicate] 【发布时间】:2021-12-01 19:36:15 【问题描述】:

考虑一个列表:[A,B,C,D]

我必须找到最快的方法将列表拆分为所有可能的对集合,以使这些对互斥: 例如,对于给定的列表,结果应该是:

    [A,B],[C,D] [A,C],[B,D] [A,D],[B,C]

【问题讨论】:

itertools 提供此功能。 @Stef 我不认为这个问题的投票最多的答案会有所帮助 @DaniMesejo 投票最多的答案甚至不能很好地帮助它回答问题。但是,问题本身和其余答案似乎相关。 一个类似但不相同的问题:Get n * k unique sets of 2 from list of length n in Python 【参考方案1】:

简单的递归版本:

def all_pairings(l):
  if len(l) == 0:
    return [[]]
  else:
    return [[(l[0],l[i])] + p for i in range(1,len(l)) for p in all_pairings(l[1:i]+l[i+1:])]

all_pairings('')
# [[]]

all_pairings('ab')
# [[('a', 'b')]]

all_pairings('abcd')
# [[('a', 'b'), ('c', 'd')], [('a', 'c'), ('b', 'd')], [('a', 'd'), ('b', 'c')]]

all_pairings('abcdef')
# [[('a', 'b'), ('c', 'd'), ('e', 'f')], [('a', 'b'), ('c', 'e'), ('d', 'f')],
#  [('a', 'b'), ('c', 'f'), ('d', 'e')], [('a', 'c'), ('b', 'd'), ('e', 'f')],
#  [('a', 'c'), ('b', 'e'), ('d', 'f')], [('a', 'c'), ('b', 'f'), ('d', 'e')],
#  [('a', 'd'), ('b', 'c'), ('e', 'f')], [('a', 'd'), ('b', 'e'), ('c', 'f')],
#  [('a', 'd'), ('b', 'f'), ('c', 'e')], [('a', 'e'), ('b', 'c'), ('d', 'f')],
#  [('a', 'e'), ('b', 'd'), ('c', 'f')], [('a', 'e'), ('b', 'f'), ('c', 'd')],
#  [('a', 'f'), ('b', 'c'), ('d', 'e')], [('a', 'f'), ('b', 'd'), ('c', 'e')],
#  [('a', 'f'), ('b', 'e'), ('c', 'd')]]

【讨论】:

非常感谢,这正是我想要的! :) 只是对我的问题的另一个扩展,如果我要总结与每对相关的值,代码会是什么样子?例如,[a,b,c,d] 将返回 [[('a', 'b'), ('c', 'd')], [('a', 'c'), ( 'b', 'd')], [('a', 'd'), ('b', 'c')]] .. 如果每一对都有一个与之相关的分数,例如 ->(a,b ): 10, (c,d):20, (a,c):30, (b,d):40, (a,d):50, (b,c):60.. 然后 [[(' a', 'b'), ('c', 'd')], [('a', 'c'), ('b', 'd')], [('a', 'd' ), ('b', 'c')]] 看起来像 [10+20,30+40,50+60]=[30,70,110] @ShreyaJoshi 不知道你的意思。你能提供一个输入列表 [1, 2, 3, 4] 的输出示例吗? 刚刚编辑了评论并添加了示例 @ShreyaJoshi 然后您可以使用map 或list comprehension 来迭代all_pairings 的结果。假设你的值在一个名为d=('a','b'): 10, ('c','d'):20, ('a','c'):30, ...的字典中,那么你可以写result = [sum(d[pair] for pair in pairing) for pairing in all_pairings('abcd')] 由于某种原因,这给出了超出最大递归深度的错误..

以上是关于获取可以从python中的列表形成的所有互斥对的最快方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java - 从列表/数组中的每个对象获取单个属性的最简单方法?

如何使用 Python 从 Github API 中的所有页面获取数据?

如何从 Erlang 中的对列表中获取元素

形成两个列表并集的最简单方法

按字符串查找字符串中的所有括号 - Python 3

是否可以使用 python 3 对 h5py 中的键进行切片而不形成列表?