2015-02-04 3 views
0

저는 파이썬과 프로그래밍에 대해 매우 익숙합니다. 나는이 사이트에서 많은 유용한 아이템을 발견했지만, 내가 원하는 것을 성취하는 가장 좋은 방법에 관해 혼란스러워했다.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']] 

, 나는 세트 등 튜플의 목록을 사용하여 여러 가지를 시도 나의 최근 '시도'그냥 결과를 얻을 수 있는지 확인하기 위해 노력했다-I는 다음과 같이 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는 9999 것이 이상한데도 불구하고'all (a == b, a는 b, z는 (RemoteLA [i] [, Master [j]))'로 대체 될 수 있습니다. – njzk2

+0

그런 까다로운 지표 변수를 수행하십시오. RemoteLA ** 등에서 ll을 사용하는 것이 더 좋습니다. 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를하기 위해, (O (nlogn)) 먼저 목록을 정렬 할 것이다 (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) 

HTH.

+0

제안 해 주셔서 감사합니다. 이것이 내 최선의 선택 인 것 같습니다. 나는 이것에 관해 조금 일할 것이다, – ceitel