1

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のドキュメントで「ペアワイズ」という関数を見つけました。しかし、私の場合に可能であれば、それをどのように適応させるか、または私の試みを改善する方法がわかりません。何か助けはありますか?

4

2 に答える 2

4

あなたの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']}]

すべてを1つのライナージェネレーターに結合することもできます。

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()

于 2012-11-26T10:37:14.020 に答える
1

すべてのペアの組み合わせが必要な場合は、おそらく次の短い方を使用できますが、これがより効率的であるとは言えません。

[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']}]
于 2012-11-26T10:20:43.377 に答える