2015-02-04 3 views
0

Я очень новичок в Python и программировании в целом. Я нашел много полезных статей на этом сайте, но я также смутил себя в отношении того, что лучший способ выполнить то, что мне нужно.Python Сравнение вложенных списков

Проще говоря, у меня есть 2 файла csv, RemoteLA и Master. Каждая позиция содержит Order #, LastName, FirstName, MI, Account #. Мне нужно найти элементы из RemoteLA, которые не находятся в главном файле. Моя основная проблема заключается в совпадении/проверке 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']] 

Как я уже сказал, я попробовал много вещей, используя наборы, список кортежей и т.д. Мой последний «попытка» использовал время цикла следующим образом, я просто пытался увидеть, если я мог бы получить результаты Я хотел, но, похоже, я все еще делаю что-то неправильно.

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 в zip (RemoteLA [i] [, Master [j]))' хотя это 9999 вещь странная – njzk2

+0

в Python вы не делать такие неприятные индексные переменные. Лучше использовать ** для ll в 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 (п) сравнение.

+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

Смежные вопросы