2015-02-04 36 views
0

我对Python和编程一般都很陌生。我在这个网站上发现了很多有用的东西,但是我也很困惑自己是否想要完成我所需要的最好的方法。Python比较嵌套列表

简而言之,我有2个csv文件,RemoteLA和Master。每个订单项都包含订单号,姓氏,名字,MI,账号#。我必须从RemoteLA中找到不在主文件中的项目。我主要关心的是匹配/验证Order#first,然后是Account#,然后是名称。有些情况下,我可以有两个相同的订单#但不同的名称和账户号码,只要它在主文件中列出相同即可。最后,如果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 

任何帮助或推动正确的方向将非常感激。对不起,我很抱歉。谢谢。

+0

你的3个ifs可以用'all(a == b代替a,b in zip(RemoteLA [i] [,Master [j]))''虽然9999的东西在Python中是奇怪的 – njzk2

+0

你不需要做这样讨厌的索引变量。在RemoteLA **中更好地使用**,无需拥有这样的C风格索引变量 – tschm

+0

我实际上有4个“远程”文件进行比较,其中一个帐号与所有9个一起列出 - 直到这是固定的,任何帐户号码列为9999我想通过没有做任何事情。 – ceitel

回答

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)比较。

+0

这是我的不好。我的清单全部按订单#排序,但我上面的检测清单是按顺序手动输入的。 – ceitel

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) 

心连心。

+0

谢谢你的建议。这听起来像是我最好的选择。我会稍微处理一下, – ceitel