2017-03-15 3 views
0

私は辞書のリストを持っています。辞書のリストの間で共通のキー値のペアを見つけるためのpythonic方法

alljson = [{'EchoTime': 0, 
    'FlipAngle': 90, 
    'MRAcquisitionType': '2D', 
    'MagneticFieldStrength': 3, 
    'Manufacturer': 'SIEMENS', 
    'ManufacturerModelName': 'TrioTim', 
    'RepetitionTime': 2, 
    'ScanOptions': 'FS', 
    'ScanningSequence': 'AP', 
    'SequenceVariant': 'SK', 
    'TaskName': 'Tom'}, 
{'EchoTime': 0, 
    'FlipAngle': 90, 
    'MRAcquisitionType': '2D', 
    'MagneticFieldStrength': 3, 
    'Manufacturer': 'SIEMENS', 
    'ManufacturerModelName': 'TrioTim', 
    'RepetitionTime': 2, 
    'ScanOptions': 'FS', 
    'ScanningSequence': 'EP', 
    'SequenceVariant': 'SK', 
    'TaskName': 'fb'}, 
{'EchoTime': 0, 
    'FlipAngle': 90, 
    'MRAcquisitionType': '2D', 
    'MagneticFieldStrength': 3, 
    'Manufacturer': 'SIEMENS', 
    'ManufacturerModelName': 'TrioTim', 
    'RepetitionTime': 2, 
    'ScanOptions': 'FS', 
    'ScanningSequence': 'EP', 
    'SequenceVariant': 'HK', 
    'TaskName': 'Tom-loc'}] 

ここでは、すべての共通キー値のペアをdictのリストから見つけるつもりです。 これを行う最も無邪気な方法は何でしょうか。

注:キーと値の両方が一致する必要があり、そしてK:Vペアがすべて辞書

に存在しなければならない私が試したすべての溶液はhereを提案が、与えられた値は、非ハッシュ可能であり、溶液のいずれも完全に機能していません。

提案がありますか?

+2

あなたのリストの3つのdictsはすべて同じです。あなたは正確に何を返そうとしていますか? – lordingtar

+1

あなたの値は、私が立っているところからかなりハッシュ可能です。 –

+0

@lordingtar私はあなたの質問を編集で説明しようとしました。また、今のところdictは同じではない – learnningprogramming

答えて

0
reduce(lambda x, y: dict(set(x.items()).intersection(set(y.items()))), alljson) 
+0

FYR、関数reduceはPython 3で推奨されなくなりました。 – DyZ

+0

@DYZ知っておきたいこと、ありがとう! – Charlie

3

、セットに項目の各辞書のリストを変換し、設定された交差点を見つけ、必要に応じてバック辞書に結果を変換します

dict(set.intersection(*[set(d.items()) for d in alljson])) 
#{'MRAcquisitionType': '2D', 'FlipAngle': 90, 'RepetitionTime': 2, 
# 'ScanOptions': 'FS', 'ManufacturerModelName': 'TrioTim', 
# 'Manufacturer': 'SIEMENS', 'SequenceVariant': 'SK', 'EchoTime': 0, 
# 'MagneticFieldStrength': 3, 'ScanningSequence': 'EP'} 
+0

私はこれが正確だとは思わない。 EchoTimeは3回発生しますが、これはテストで0を返します。 – putonspectacles

+0

@putonspectaclesもう一度確認してください。それは私の場合に返されます。 – DyZ

+1

ああ、私は質問を間違えた、彼はちょうどユニークな出現を求めた。私はこれが本当に好きです。 '*' – putonspectacles

0

それはあなたが「普通」のペアで何を意味するかに依存します、しかし、あなたはタプルのリストに各辞書を変換して、リストのすべての交差点を見つけることができますが、「すべての辞書に存在するペア」を意味仮定:

list_of_lists = [x.items() for x in alljson] 
common_pairs = set(list_of_lists[0]).intersection(*list_of_lists) 
print(common_pairs) 
1
>>> import operator as op 
>>> reduce(op.iand, map(set, [d.items() for d in alljson])) 
+0

素敵な、ここに演算子に関するドキュメントがあります:https://docs.python.org/2/library/operator.html – putonspectacles

+1

FYR、関数 'reduce'はPython 3では廃止されました。 – DyZ

+2

@DYZ廃止予定はありませんしかし、はい、 '' __builtins''を '' functools''モジュールに移したので、 '' import''が必要です。 https://docs.python.org/3.6/library/functools.html#functools.reduce – Meitham

0

この1つは長いですが、私にはそれが直感的です:

count = {} 
final = [] 

for dictionary in alljson: 
    for key in dictionary: 
    if key in count: 
     count[key] += 1 
    else: 
     count[key] = 1 

for key in count: 
    if count[key] == len(alljson): 
    final.append(key) 

print final 

ループalljsonを通って、各キーが現れる回数を数えます。次に、すべての辞書に表示されるキーのみを返します。

関連する問題