繁体   English   中英

比较两个基于python的元组列表

[英]Compare two List of tuples based in python

尝试根据两个列表中存在的键比较两个元组列表。 我的列表如下所示。

sr = [('#1', '004634105000', 'sr1'), ('#2', '01fG91258000', 'sr2'), ('#6','01F991259000', 'sr3'), ('#4', '07W997296000', 'sr4'), ('#5', '07W997296000', 'sr5'), ('#7', '454546465666', 'sr6'), ('#7', '4545TRY5666', 'sr7')]

tr = [ ('#1', '00461U105000', 'tr1'), ('#2', '01F991258000', 'tr2'),
('#3', '01F991259000', 'tr3'), ('#4', '07W997296000', 'tr4'),
('#5', '07W997296000', 'tr5'), ('#6', '454546465666', 'tr6')]

考虑到第一个元素作为比较的关键,我想要这样的输出

common records:('#1', '004634105000', 'sr1'), ('#1', '00461U105000', 'tr1') ('#2', '01fG91258000', 'sr2'), ('#2', '01F991258000', 'tr2') ('#4', '07W997296000', 'sr4'), ('#4', '07W997296000', 'tr4') ('#5', '07W997296000', 'sr5') , ('#5', '07W997296000', 'tr5')
present only in sr: ('#7', '454546465666', 'sr6'), ('#7', '4545TRY5666', 'sr7')
present only in tr: ('#6', '454546465666', 'tr6')

这是我尝试的代码,但未提供所需的输出

source = []
for key in tr:
    source = key[0]
for value in sr:
    if value[0] not in source:
        print (value[0], value[1], value[2])   

target = []

for key in sr:
    target = key[0]
   # print (target)
for value in tr:
    #print (value[0]) 
    if value[0] not in target:
        print (value[0], value[1], value[2])

common = [] 

for key in sr:
    common = key[0]
   # print (target)
for value in tr:
    #print (value[0]) 
    if value[0] in common:
      print (value[0], value[1], value[2]) 

如果有人可以帮助我,那我会在循环中丢失某些内容,也不会处理重复项。 谢谢

首先,以标准方式按键对数据进行分组:

by_key={}
for xr in (sr,tr):  # cover both lists
  for x in xr:
    by_key.setdefault(x[0], []).append(x)

然后,形成键集:

sk=set(x[0] for x in sr)
tk=set(x[0] for x in tr)

然后解决三个类别:

for nm,keys in (("common records",sk&tk),
                ("present only in sr",sk-tk),
                ("present only in tr",tk-sk)):
  print(nm+':', " ".join(str(x) for k in keys for x in by_key[k]))

与您自己的代码最接近的解决方案是:

sr = [('#1', '004634105000', 'sr1'), ('#2', '01fG91258000', 'sr2'),
      ('#6','01F991259000', 'sr3'), ('#4', '07W997296000', 'sr4'), 
      ('#5', '07W997296000', 'sr5'), ('#7', '454546465666', 'sr6'), 
      ('#7', '4545TRY5666', 'sr7')]

tr = [('#1', '00461U105000', 'tr1'), ('#2', '01F991258000', 'tr2'),
      ('#3', '01F991259000', 'tr3'), ('#4', '07W997296000', 'tr4'),
      ('#5', '07W997296000', 'tr5'), ('#6', '454546465666', 'tr6')]

print ("present only in sr")
source = []
for key in tr:
    source.append(key[0])
for value in sr:
    if value[0] not in source:
        print (value[0], value[1], value[2])

print ("present only in tr")
target = []

for key in sr:
    target.append(key[0])
for value in tr:
    if value[0] not in target:
        print (value[0], value[1], value[2])

print ("common entries")
common = []

for key in sr:
    common.append(key[0])
for value in tr:
    if value[0] in common:
      print (value[0], value[1], value[2])

您缺少的部分是:

source.append(key[0])

这会将key[0]的值添加到您的源列表中。

但是,您应该考虑使用字典,如Davis Herring所建议的那样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM