在Python中,我有一个像这样的字典......
pleio = {'firstLine': {'enf1': ['54', 'set'],
'enf2': ['48', 'free'],
'enf3': ['34', 'set'],
'enf4': ['12', 'free']}
'secondLine':{'enf5': ['56','bgb']
'enf6': ['67','kiol']
'enf7': ['11','dewd']
'enf8': ['464','cona']}}
我想进行配对组合,而不重复内部字典中的元素,最终得到这样的结果......
{'enf3': ['34', 'set'], 'enf2': ['48', 'free']}
{'enf3': ['34', 'set'], 'enf1': ['54', 'set']}
{'enf3': ['34', 'set'], 'enf4': ['12', 'free']}
{'enf2': ['48', 'free'], 'enf1': ['54', 'set']}
{'enf2': ['48', 'free'], 'enf4': ['12', 'free']}
{'enf1': ['54', 'set'], 'enf4': ['12', 'free']}
我构建了一个可以让我做到这一点的函数...
import itertools
def pairwise():
'''
'''
leti=[]
for snp, enfs in pleio.items():
for x in itertools.combinations(enfs, 2 ):
leti.append(x)
pleopairs=[]
for i in leti:
pipi={}
for c in i:
pipi[c]= enfs[c]
pleopairs.append(pipi)
..但我想知道是否有更有效的方法,例如 itertools 或任何其他来源的另一个特定函数。顺便说一句,我在 itertools 中发现了一个名为“pairwise”的函数文档。但我不知道如何适应它(如果在我的情况下可能的话),或改进我的尝试。有什么帮助吗?
最佳答案
您的combinations
方法是正确的,你只需要把每个组合的结果再次转换成字典即可:
import itertools
def pairwise(input):
for values in input.itervalues():
for pair in itertools.combinations(values.iteritems(), 2):
yield dict(pair)
这个版本是一个生成器,可以有效地生成对,没有任何内容会保存在内存中超过绝对必要的时间。如果您需要 list ,只需调用 list()
在发电机上:
list(pairwise(pleio))
输出:
>>> from pprint import pprint
>>> pprint(list(pairwise(pleio)))
[{'enf2': ['48', 'free'], 'enf3': ['34', 'set']},
{'enf1': ['54', 'set'], 'enf3': ['34', 'set']},
{'enf3': ['34', 'set'], 'enf4': ['12', 'free']},
{'enf1': ['54', 'set'], 'enf2': ['48', 'free']},
{'enf2': ['48', 'free'], 'enf4': ['12', 'free']},
{'enf1': ['54', 'set'], 'enf4': ['12', 'free']}]
您甚至可以将整个事情组合成一个单行生成器:
from itertools import combinations
for paired in (dict(p) for v in pleio.itervalues() for p in combinations(v.iteritems(), 2)):
print paired
哪些输出:
>>> for paired in (dict(p) for v in pleio.itervalues() for p in combinations(v.iteritems(), 2)):
... print paired
...
{'enf3': ['34', 'set'], 'enf2': ['48', 'free']}
{'enf3': ['34', 'set'], 'enf1': ['54', 'set']}
{'enf3': ['34', 'set'], 'enf4': ['12', 'free']}
{'enf2': ['48', 'free'], 'enf1': ['54', 'set']}
{'enf2': ['48', 'free'], 'enf4': ['12', 'free']}
{'enf1': ['54', 'set'], 'enf4': ['12', 'free']}
如果您使用的是 Python 3,请替换 .itervalues()
和.iteritems()
通过.values()
和.items()
分别。
关于python - 字典中元素的配对组合,不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13562613/