我对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
非常感谢任何帮助或推动正确的方向。抱歉这个讽刺。谢谢。
答案 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)比较。