【发布时间】:2017-09-01 13:44:21
【问题描述】:
old = [('ver','1121'),('sign','89'),('address','A45'),('type','00')]
new = [('ver','1121'),('sign','89'),('type','01')]
我需要根据元组的第一个元素将new 列表与old 进行比较,并显示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)]
更新
感谢@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
-
@MooingRawr 比较应该只适用于 new 中可用的项目
-
输出的顺序重要吗?列表的顺序例如:
ver应该在前,sign下一个
标签: python list tuples list-comprehension