比较两个元组列表

Ron*_*Ron 4 python tuples list-comprehension list

old = [('ver','1121'),('sign','89'),('address','A45'),('type','00')]
new = [('ver','1121'),('sign','89'),('type','01')]
Run Code Online (Sandbox Code Playgroud)

我需要将new列表与old基于元组的第一个元素的列表进行比较,并显示new列表中任何元素之间的差异,以便输出看起来像:

Match     : ver   =   1121
Match     : sign  =   89
Mismatch  : type  =   01 (old : 00)
Run Code Online (Sandbox Code Playgroud)

我可以使用下面的列表理解来获取所有匹配的元组,但无法超越。

my_list = [(a,b) for (a,b) in new for (c,d) in old  if ((a==c) and (b==d))]
print( my_list)
Run Code Online (Sandbox Code Playgroud)

请给我建议一种方法。

编辑

抱歉,我不清楚我的问题,我没有再提及一件事,列表中的键可以重复,这意味着列表可以像这样:

old = [('ver','1121'),('sign','89'),('address','A45'),('type','00'),('ver','sorry')]

new = [('ver','1121'),('sign','89'),('type','01'),('ver','sorry)]
Run Code Online (Sandbox Code Playgroud)

更新

感谢@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])))
Run Code Online (Sandbox Code Playgroud)

Bri*_*uez 6

您可以使用set

>>> old = [('ver','1121'),('sign','89'),('address','A45'),('type','00')]
>>> new = [('ver','1121'),('sign','89'),('type','01')]

>>> print('no longer there:', set(old) - set(new))
no longer there: {('type', '00'), ('address', 'A45')}

>>> print('newly added:', set(new) - set(old))
newly added: {('type', '01')}

>>> print('still there:', set(old) & set(new))
still there: {('sign', '89'), ('ver', '1121')}
Run Code Online (Sandbox Code Playgroud)


Dad*_*dep 0

你可以这样做:

old = [('ver','1121'),('sign','89'),('address','A45'),('type','00')]
new = [('ver','1121'),('sign','89'),('type','01')]
my_list = [(a,b) for (a,b) in new for (c,d) in old  if ((a==c) and (b==d))]
for i in old:
     if i in my_list:
             print "Match : ", i
     else:
             print "Mismatch : ", i
Run Code Online (Sandbox Code Playgroud)

这会给你:

Match :  ('ver', '1121')
Match :  ('sign', '89')
Mismatch :  ('address', 'A45')
Mismatch :  ('type', '00')
Run Code Online (Sandbox Code Playgroud)

但肯定有一种更“Pythonic”的方式......