簡體   English   中英

在字典列表中查找公用鍵值對的pythonic方法

[英]pythonic way to find common key value pair among list of dict

我有一個字典清單。

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

現在,我打算從字典列表中查找所有常見的鍵值對。 什么是最蟒蛇的方式做到這一點。

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

我嘗試了此處建議的所有解決方案但是給定的值不可散列,所有解決方案均無法正常工作。

有什么建議么?

將每個字典的項目列表轉換為集合,找到集合的交集,然后有選擇地將結果轉換回字典:

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

這取決於您所說的“公共”對的含義,但是假設您的意思是“每個字典中都存在對”,則可以將每個字典轉換為元組列表,然后找到所有列表的交集:

list_of_lists = [x.items() for x in alljson]
common_pairs = set(list_of_lists[0]).intersection(*list_of_lists)
print(common_pairs)
>>> import operator as op
>>> reduce(op.iand, map(set, [d.items() for d in alljson]))
 reduce(lambda x, y: dict(set(x.items()).intersection(set(y.items()))), alljson)
{k : v for x in alljson for (k, v) in x.items()} 

這個更長,但對我來說很直觀:

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並計算每個鍵顯示多少次。 然后僅返回顯示在每個詞典中的鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM