2017-03-15 5 views
0

사전 목록이 있습니다.공상 목록에서 공통 키 값 쌍을 찾는 파이썬 방법

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

에 존재해야 내가하려고하는 모든 솔루션 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, 함수 감소는 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' 함수는 파이썬 3에서 더 이상 사용되지 않습니다. – DyZ

+2

@DYZ deprecated라고하지는 않겠습니다. , 그렇습니다. 그렇지만''__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 통해 계산 얼마나 많은 시간을 각 키가 표시됩니다. 그런 다음 모든 사전에 나타나는 키만 반환하십시오.