在dict列表中查找公共键值对的pythonic方法

在dict列表中查找公共键值对的pythonic方法,python,dictionary,intersection,Python,Dictionary,Intersection,我有一份字典清单 alljson = [{'EchoTime': 0, 'FlipAngle': 90, 'MRAcquisitionType': '2D', 'MagneticFieldStrength': 3, 'Manufacturer': 'SIEMENS', 'ManufacturerModelName': 'TrioTim', 'RepetitionTime': 2, 'ScanOptions': 'FS', 'ScanningSequence': '

我有一份字典清单

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对应该存在于所有dict中

我尝试了所有建议的解决方案,但给定的值是不可散列的,没有一个解决方案完全有效


有什么建议吗

将每个字典的项目列表转换为一个集合,找到集合的交集,并可以选择将结果转换回字典:

 reduce(lambda x, y: dict(set(x.items()).intersection(set(y.items()))), alljson)
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'}

将每个字典的项目列表转换为一个集合,查找集合交集,并可以选择将结果转换回字典:

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)

这取决于“公共”对的含义,但假设您的意思是“每个字典中都有对”,则可以将每个字典转换为元组列表,然后找到所有列表的交集:

list_of_lists = [x.items() for x in alljson]
common_pairs = set(list_of_lists[0]).intersection(*list_of_lists)
print(common_pairs)

这一个更长,但对我来说是直观的:

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并计算每个键出现的次数。然后只返回每个字典中显示的键。

这一个较长,但对我来说是直观的:

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并计算每个键出现的次数。然后只返回每个字典中显示的键。

列表中的三个dict都是相同的。你到底想返回什么?从我的立场来看,你的值看起来确实很容易散列。@lordingtar我试着在编辑中解释你的问题。另外,现在的格言也不一样了。你名单上的三个格言都是一样的。你到底想返回什么?从我的立场来看,你的值看起来确实很容易散列。@lordingtar我试着在编辑中解释你的问题。我不认为这是完全正确的。EchoTime出现3次,但在我的测试中返回0。@PutonSpectraces再次检查。在我的情况下,它是返回的。啊,我误读了这个问题,他问的只是唯一的事件。我真的很喜欢这一点,炫耀python扩展
*
@DYZ它让我犯了一个错误,说
'dict'对象不可调用
@learnningprogramming您必须在程序中的某个地方重新定义
dict
。请确保您没有类似于
dict=…
,然后重新启动解释器。我认为这并不完全正确。EchoTime出现3次,但在我的测试中返回0。@PutonSpectraces再次检查。在我的情况下,它是返回的。啊,我误读了这个问题,他问的只是唯一的事件。我真的很喜欢这一点,炫耀python扩展
*
@DYZ它让我犯了一个错误,说
'dict'对象不可调用
@learnningprogramming您必须在程序中的某个地方重新定义
dict
。请确保没有类似于
dict=…
,然后重新启动解释器。很好,这是关于运算符的文档:FYR,函数
reduce
在Python 3中已被弃用。@DYZ我不会说弃用,但是是的,它已从
\u内置项
移到
functools
模块中,因此需要导入
。可爱的,这是关于操作符的文档:FYR,函数
reduce
在Python3中已被弃用。@DYZ我不会说弃用了,但是的,它已从
\u内置项
移到
functools
模块中,因此需要导入
。FYR,函数reduce在Python3.FYR中被弃用,函数reduce在Python3中被弃用。