词典中不重复的元素对组合

2024-04-19 03:01:54 发布

您现在位置:Python中文网/ 问答频道 /正文

在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']}}

我想做一个配对的组合,没有重复的元素在内部字典,以结束这样的结果。。。在

^{pr2}$

我建立了一个函数,让我去做。。。在

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”的函数。但我不知道如何去适应它,如果可能的话,或者改进我的尝试。有什么帮助吗?在


Tags: 函数infreefor字典itertoolssetpairwise
2条回答

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

import itertools

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

这个版本是一个生成器,可以高效地生成对,没有任何东西比绝对必要的时间更长地保存在内存中。如果需要列表,只需调用生成器上的list()

^{pr2}$

输出:

>>> 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']}

如果您使用的是python3,请将.itervalues()和{}分别替换为.values()和{}。在

如果你想要所有的对组合,你可以用下面的短一点的,但我不能说这是更有效的。在

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

输出

^{pr2}$

相关问题 更多 >