python - 字典中元素的配对组合,不重复

标签 python combinatorics python-itertools

在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/

相关文章:

python - itertools 组合与替换与限制

python - pandas 计算前 N 个数据帧行的 rolling_std

python - 注释中的字符出错

java - 使用动态规划删除中间元素的三重乘积的最小总和

python - k-字典序排列

haskell - Haskell 中 2 个列表的笛卡尔积

python - 为 itertools 重复一个 numpy 数组指定的次数

python - 为什么 groupby 和 rolling 不能一起工作?

python - 如何持久化 Python TextBlob 的模型?

python - python是否具有用于交错生成器/序列的内置函数?