我有一个词典列表。
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列表中找到所有公共键值对。 什么是最pythonic的方式来做到这一点。
注意:键和值都应该匹配,并且k:v对应该存在于所有dict中
我尝试了所有建议的解决方案here,但是给定值是不可清除的,没有一个解决方案完全有效。
有什么建议吗?
答案 0 :(得分: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'}
答案 1 :(得分:1)
这取决于“常见”对的含义,但假设你的意思是“每个字典中存在对”,你可以将每个字典转换为元组列表,然后找到所有列表的交集:
list_of_lists = [x.items() for x in alljson]
common_pairs = set(list_of_lists[0]).intersection(*list_of_lists)
print(common_pairs)
答案 2 :(得分:1)
>>> import operator as op
>>> reduce(op.iand, map(set, [d.items() for d in alljson]))
答案 3 :(得分:0)
reduce(lambda x, y: dict(set(x.items()).intersection(set(y.items()))), alljson)
答案 4 :(得分:0)
{k : v for x in alljson for (k, v) in x.items()}
答案 5 :(得分: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并计算每个键出现的次数。然后只返回每个字典中显示的键。