2017-03-15 3 views
0

Ich habe eine Liste von Wörterbüchern.Pythonische Weise zu gemeinsamen Schlüsselwert Paar unter der Liste der 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'}] 

Jetzt habe ich vor, alle gängigen Schlüsselwertpaare aus der Liste der dict zu finden. was würde der pythischste Weg sein, es zu tun.

Hinweis: Schlüssel und Wert sollten beide übereinstimmen, und k: v Paar sollte in allen dict

ich existiere versucht alle Lösungen here vorgeschlagen, aber angegebenen Werte sind nicht hashable, keiner der Lösung arbeitet voll.

irgendwelche Vorschläge?

+2

Alle drei Diktate in Ihrer Liste sind gleich. Was genau möchtest du zurückgeben? – lordingtar

+1

Ihre Werte sehen ziemlich gut aus, wo ich stehe. –

+0

@lordingtar Ich habe versucht, Ihre Frage zu bearbeiten. Auch dict jetzt sind nicht gleich – learnningprogramming

Antwort

0
reduce(lambda x, y: dict(set(x.items()).intersection(set(y.items()))), alljson) 
+0

FYR, Funktion zu reduzieren ist in Python 3 veraltet. – DyZ

+0

@DYZ gut zu wissen, danke! – Charlie

3

Konvertieren jeder Liste Wörterbuch der Elemente in einem Satz, finden Sie die Schnittmenge und gegebenenfalls das Ergebnis zurück in ein Wörterbuch konvertieren:

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

Ich denke nicht, dass das genau richtig ist. EchoTime tritt 3 mal auf, aber das gibt 0 in meinen Tests zurück. – putonspectacles

+0

@putonspectacles Überprüfen Sie noch einmal. Es ist in meinem Fall zurückgegeben. – DyZ

+1

ahh, ich habe die Frage falsch gelesen, er hat nur nach den einzigartigen Vorkommnissen gefragt. Ich mag das wirklich, zeige die Python-Erweiterung '*' – putonspectacles

0

Es hängt davon ab, was Sie mit „gemeinsamen“ Paare bedeuten , aber vorausgesetzt, Sie ‚Paare, die in jedem Wörterbuch‘ bedeutet, können Sie jedes Wörterbuch zu Listen von Tupeln konvertieren und dann die Kreuzung von allen Listen finden:

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

schön, hier ist die Dokumentation auf Operatoren: https://docs.python.org/2/library/operator.html – putonspectacles

+1

FYR, Funktion 'reduzieren' wurde in Python 3 veraltet. – DyZ

+2

@DYZ würde ich nicht veraltet sagen , aber ja, es wurde von '' __builtins'' in das '' functools'' Modul verschoben, so dass es ein '' import'' benötigt. https://docs.python.org/3.6/library/functools.html#functools.reduce – Meitham

0

Dieser länger ist, aber es ist intuitiv zu mir:

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 

Schleife durch alljson und zählen, wie oft jede Taste erscheint. Geben Sie dann nur die Schlüssel zurück, die in jedem Wörterbuch angezeigt werden.

Verwandte Themen