Python比较嵌套列表

时间:2015-02-04 21:49:56

标签: python compare nested-lists

我对Python和编程很新。我在这个网站上找到了很多有用的东西,但是我也把自己弄糊涂了什么是实现我需要的最佳方法。

简单地说,我有2个csv文件,RemoteLA和Master。每个订单项都包含Order#,LastName,FirstName,MI,Account#。我必须找到RemoteLA中不在主文件中的项目。我主要关心的是首先匹配/验证订单#,然后是帐号#,然后是名称。在某些情况下,我可以拥有两个相同的订单#但不同的名称和帐号#,只要在主文件中列出相同的名称就可以了。最后,如果RemoteLA订单号在主文件中,但帐号被错误地列出,我想用不同的输出打印它,而不是在主文件中订单#不是。以下是我的简化列表。

RemoteLA = [['100', 'JACKSON', 'CHRIS', 'D', '12344'], ['110', 'SMITH', 'JANET', 'L' '1223'], ['120', 'STONE', 'MAX', 'W', '1233']]
Master = [['100', 'JACKSON', 'CHRIS', 'D', '1234'], ['90', 'BARST', 'JOEY', 'D', '1344'], ['80', 'NORDON', 'BEV', 'A', '1122'], ['120', 'STONE', 'MAX', 'W', '1233']]

就像我说的那样,我尝试了许多使用套装,元组列表等的东西。我的最后一次尝试'正在使用while循环如下 - 我只是想看看我是否能得到我想要的结果,但看起来我仍然做错了。

i=0
while i < len(RemoteLA):
    j = 0
    while j < len(Master):
        if RemoteLA[i][0] == Master[j][0]:
            if RemoteLA[i][1] == Master[j][1]:
                if RemoteLA[i][2] == Master[j][2]:
                    print('All match')
                elif RemoteLA[i][2] == '9999':
                    pass
                else:
                    print('Account number does not match')
            else:
                print('Name does not match')
        else:
            print('Order number does not match')
        j = j + 1
    i = i + 1

非常感谢任何帮助或推动正确的方向。抱歉这个讽刺。谢谢。

2 个答案:

答案 0 :(得分:1)

如果我理解,帐号是唯一的。因此将它们用作字典键。在这里,让我们重新组织您的数据:

def orderSummary(lst):
  info = collections.defaultdict(dict)
  for item in lst:
    acct = item[4]
    orderinfo = info[acct]
    ordernum = item[0]
    if ordernum in orderinfo:
      print "duplicate order number"
    else:
      orderinfo[ordernum] = tuple(item[1:4]) #the name
  return info

remote = orderSummary(RemoteLA)
master = orderSummary(Master)

现在我们准备检查遥控器对主人了:

def checkRemoteAgainstMater(remote,master):
  for acct,info in remote.items():
    masterinfo = master.get(acct,None)
    if masterinfo is None:
      print "bad account number {}".format(acct)
    else:
      for order in info:
        if order not in masterinfo:
          print "Master missing order"
        elif info[order] != masterinfo[order]:
          print "name mismatch"

checkRemoteAgainstMater(remote,master)

第h

答案 1 :(得分:0)

更短(虽然效率低)将是:

import itertools
for master,remote in itertools.product(Master, RemoteLA):
    if all(r == m for r,m in zip(master, remote)):
        print "Match", master

更高效的版本是首先对列表进行排序(O(nlogn)),以便进行O(n)比较。