2017-03-15 79 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'}] 

現在我打算從字典列表中找到所有常見的鍵值對。 什麼是最pythonic的方式來做到這一點。

注:鍵和值都應該匹配,並且k:v對應該在所有字典

存在我嘗試了所有的解決方案建議here但給定的值都是非可哈希,沒有一個解決方案的全面工作。

有什麼建議嗎?

+2

列表中的所有三個字母都是一樣的。你想要返回什麼? – lordingtar

+1

你的價值觀從我所站的地方看起來很難看。 –

+0

@lordingtar我試着在編輯中解釋你的問題。也字典現在不一樣 – 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

啊,我誤解了這個問題,他只是要求唯一的出現。我真的很喜歡這個,展示python擴展'*' – 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

這一個歷時較長,但對我來說這是直觀的:

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並指望有多少次,每次按鍵顯示出來。然後只返回每個字典中顯示的密鑰。

相關問題