old = [('ver','1121'),('sign','89'),('address','A45'),('type','00')]
new = [('ver','1121'),('sign','89'),('type','01')]
ich die new
Liste gegen old
ein basierend auf dem ersten Element der Tupel vergleichen müssen, und zeigen den Unterschied zwischen was auch immer Elemente new
Liste hat, so dass die Ausgabe sollte wie folgt aussehen:Vergleichen Sie zwei Listen von Tupeln
Match : ver = 1121
Match : sign = 89
Mismatch : type = 01 (old : 00)
Ich könnte alle passenden Tupel mit unten Liste Verständnis bekommen, aber konnte nicht darüber hinaus denken.
Bitte schlagen Sie mir einen Weg vor, es zu tun.
EDIT
Es tut mir leid für die nicht auf meine Frage ist klar, ich habe nicht eine Sache erwähnen, die Schlüssel in der Liste kann sich wiederholen, können die Liste bedeutet wie:
old = [('ver','1121'),('sign','89'),('address','A45'),('type','00'),('ver','sorry')]
new = [('ver','1121'),('sign','89'),('type','01'),('ver','sorry)]
UPDATE
Dank @holdenweb, ich habe seinen Code einige Änderungen vorgenommen und dies scheint die erwartete Ausgabe bereitstellt werden, schlagen Sie bitte, ob es irgendwelche Fehler.
old = [('ver','1121'),('sign','89'),('address','A45'),('type','00'),('ver','works?')]
new = [('ver','1121'),('sign','89'),('type','01'),('ver','This')]
formatter = "{:12}: {:8} = {}".format
newfmter = "{} (old : {})".format
kv_old = []
for i,(kn, vn) in enumerate(new):
vo = [(j,(ko,vo)) for j,(ko, vo) in enumerate(old) if (ko==kn) ]
for idx,(key,val) in vo:
if idx >=i:
kv_old = [key,val]
break;
if kv_old[1]==vn:
print(formatter("Match", kv_old[0], kv_old[1]))
else:
print(formatter("Mismatch", kn, newfmter(vn, kv_old[1])))
was würde mit "Adresse" passieren? – MooingRawr
Bitte schlagen Sie vor, wenn Sie eine andere Möglichkeit haben, die Listen zu durchlaufen, wenn sie nicht durch List-Comprehensions erreichbar sind. – Ron
Da es nicht in beiden Listen ist, nichts @MooingRawr –