簡體   English   中英

Python比較嵌套列表

[英]Python Comparing Nested Lists

我對Python和一般編程非常陌生。 我在此站點上找到了許多有用的項目,但我對實現我所需的最佳方法感到困惑。

簡單地說,我有2個csv文件,RemoteLA和Master。 每個訂單項都包含訂單號,姓氏,名字,MI,帳戶號。 我必須從RemoteLA中找到不在Master文件中的項目。 我主要關心的是首先匹配/驗證訂單號,然后是帳戶號,然后是名稱。 在某些情況下,我可以使用兩個相同的order#,但名稱和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

任何幫助或朝着正確方向推動將不勝感激。 很抱歉。 謝謝。

據我了解,帳號是唯一的。 因此,將它們用作字典鍵。 在這里,讓我們重新整理您的數據:

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)

心連心。

一個短得多的(雖然同樣低效)是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM