获取可以从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 - 从列表/数组中的每个对象获取单个属性的最简单方法?