old = [('ver','1121'),('sign','89'),('address','A45'),('type','00')]
new = [('ver','1121'),('sign','89'),('type','01')]
我需要根據元組的第一個元素來比較old
一個new
列表,並顯示任何元素new
列表中有之間的差異,從而使輸出應該看起來像兩個列表:比較元組
Match : ver = 1121
Match : sign = 89
Mismatch : type = 01 (old : 00)
我可以得到所有匹配的元組以下的列表理解,但無法超越它。
my_list = [(a,b) for (a,b) in new for (c,d) in old if ((a==c) and (b==d))]
print(my_list)
請給我一個方法來做到這一點。
編輯
我是不是就清楚我的問題很抱歉,我沒有提到一兩件事,在列表中的鍵可以重複的,這意味着列表可以是這樣的:
old = [('ver','1121'),('sign','89'),('address','A45'),('type','00'),('ver','sorry')]
new = [('ver','1121'),('sign','89'),('type','01'),('ver','sorry)]
UPDATE
感謝@holdenweb,我已經做了一些改動,以他的代碼,這似乎是提供預期的輸出,請建議,如果有任何缺陷。
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])))
「address」會發生什麼情況? – MooingRawr
請建議如果通過列表遍歷列表解析不能實現的任何其他方式。 – Ron
由於它不在兩個列表中,因此@MooingRawr –