Вложено в цикл для поиска 2 списков - PullRequest
1 голос
/ 04 августа 2011

Использование: Python 2.4

В настоящее время у меня есть вложенный цикл for, который повторяет более 2 списков и сопоставляет два элемента, присутствующих в обоих списках. Как только совпадение найдено, он входит в список из списка r120Final и добавляет новый список с именем "r120Delta":

for r120item in r120Final:
    for spectraItem in spectraFinal:
    if(str(spectraItem[0]) == r120item[2].strip()) and (str(spectraItem[25]) == r120item[10]):
        r120Delta.append(r120item)
        break

Проблема в том, что это ТАК МЕДЛЕННО, а списки не такие глубокие. R120 имеет около 64 000 линий, а Spectra - около 150000 линий.

Список r120Final является вложенным массивом и выглядит так:

r120Final[0] = [['xxx','xxx','12345','xxx','xxx','xxx','xxx','xxx','xxx','xxx','234567']]
...
r120Final[n] = [['xxx','xxx','99999','xxx','xxx','xxx','xxx','xxx','xxx','xxx','678901']]

Список spectraFinal по сути тот же, вложенный массив, и выглядит это так:

spectraFinal[0] = [['12345','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','234567']]
...
spectraFinal[0] = [['99999','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','xxx','678901']]

Наконец, причина для «r120Delta» заключается в том, что я могу затем сделать дифференциал списка между r120Final и r120Delta и получить элементы данных r120, которые НЕ были сопоставлены. Это функция, которую я определил для этой самой задачи, и снова медленно:

def listDiff( diffList, completeList ):
    returnList = []
        for completeItem in completeList:
            if not completeItem  in diffList:
                returnList.append(completeItem)
    return returnList

По сути, я хорошо осведомлен в Python, но ни в коем случае не эксперт. Я ищу экспертов, чтобы показать мне, как это ускорить. Любая помощь приветствуется!

1 Ответ

2 голосов
/ 04 августа 2011
spectra_set = set((str(spectraItem[0]), str(spectraItem[25])) for spectraItem in spectraFinal)

returnList = []
for r120item in r120Final:
    if (r120item[2].strip(), r120item[10]) not in spectra_set:
       returnList.append(r120item)

Это добавит все элементы, которые не совпадают с returnList.

Вы можете сделать это в одну строку (если вы действительно хотите) как

returnList = [r120item for r120item in r120Final 
                 if (r120item[2].strip(), r120item[10]) not in 
                     set((str(spectraItem[0]), str(spectraItem[25])) 
                         for spectraItem in spectraFinal)]

Если вам нужно полное spectraItem:

* * 1010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...