[英]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.