繁体   English   中英

配对字典中元素的组合而无需重复

[英]Pair combinations of elements in dictionary without repetition

在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文档中找到了一个称为“成对”的函数。 但是我不知道如何适应它,如果我可能的话,或者改进我的尝试。 有什么帮助吗?

您的combinations方法是正确的,您只需要再次将每个组合的结果转换为字典即可:

import itertools

def pairwise(input):
    for values in input.itervalues():
        for pair in itertools.combinations(values.iteritems(), 2):
            yield dict(pair)

这个版本是一个生成器,可以高效生成对,没有什么比绝对必要的更长的时间保存在内存中了。 如果需要列表,只需在生成器上调用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()分别。

如果您想要所有对组合,则可以使用以下较短的组合,但我不会说这样更有效。

[dict([(x,vx),(y,vy)]) for (x,vx) in pleio['firstLine'].iteritems()
                       for (y,vy) in pleio['firstLine'].iteritems()
                       if x < y]

输出量

[{'enf3': ['34', 'set'], 'enf4': ['12', 'free']},
 {'enf2': ['48', 'free'], 'enf3': ['34', 'set']},
 {'enf2': ['48', 'free'], 'enf4': ['12', 'free']},
 {'enf1': ['54', 'set'], 'enf3': ['34', 'set']},
 {'enf1': ['54', 'set'], 'enf2': ['48', 'free']},
 {'enf1': ['54', 'set'], 'enf4': ['12', 'free']}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM