Mehrere Dicts: Gucken ob alle bis auf einen Wert gleich?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

Ich hab ein paar Dictionarys, die eine beliebige Anzahl an Eintraegen haben koennen.
Sie teilen sich jedoch alle Keys.
Mein Ziel ist es zu ermitteln ob zwei Dicts aus der Menge alle bis auf einen Wert gemeinsam haben.
Beispiel:

Code: Alles auswählen

dict1 = {'y': Decimal('10'), 'x': Decimal('10'), 'z': Decimal('1')}
dict2 = {'y': Decimal('1'), 'x': Decimal('10'), 'z': Decimal('1')}
dict3 = {'y': Decimal('1'), 'x': Decimal('1'), 'z': Decimal('1')}
Der Unterschied von dict1 zu dict2 waere dann beim key 'y'.
Der Unterschied von dict1 zu dict3 waere aber dann zu gross (da zwei Werte unterschiedlich sind).

Bei zwei Dicts ginge ja folgendes:

Code: Alles auswählen

ungleich = None
for key in dict1:
    if not dict1[key] == dict2[key]:
        if ungleich is None:
            ungleich = key
        else:
            ungleich = None
            break
Wie erweitere ich das am geschicktesten auf alle dicts?
Alle in eine Liste packen und dann auch darueber iterieren?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Code: Alles auswählen

from decimal import Decimal
dict1 = {'y': Decimal('10'), 'x': Decimal('10'), 'z': Decimal('1')}
dict2 = {'y': Decimal('1'), 'x': Decimal('10'), 'z': Decimal('1')}
dict3 = {'y': Decimal('1'), 'x': Decimal('1'), 'z': Decimal('1')}

def compare(a, b):
    return [k for k in a if a[k]!=b[k]]

print compare(dict1, dict2)
print compare(dict2, dict3)
print compare(dict1, dict3)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

jbs hat geschrieben:

Code: Alles auswählen

def compare(a, b):
    return [k for k in a if a[k]!=b[k]]
Danke.
Ich denke, diese Methode werde ich noch oefter brauchen koennen.
Antworten