2013-05-08 2 views
2

У меня есть два списка списков, которые я называю old_rows и new_rows.Найти измененные или новые строки в двух списках списков

Каждая строка представляет собой список из 30 предметов. В каждом списке может быть очень большое (и неизвестное) количество строк. Эти два списка могут содержать различное количество строк.

[ [row1_item1, row1_item2... row1_item30], 
    [row2_item1, row2_item2... row2_item30], 
    .... 
    [rowN_item1, rowN_item2... rowN_item30] ] 

Где N большое и переменное.

То, что я хотел бы сделать, это сравнить old_rows и new_rows и создать список «существенных различий» - я заинтересован только в сравнении около 10 пунктов между рядами. У меня уже есть функция, которая сравнивает две строки только для этих элементов.

Так что я попытался это:

changes = [] 
    for o, n in izip_longest(old_rows, new_rows): 
     if not o: 
     changes.append(output_row(None, n)) 
     continue 
     if not n: 
     continue 
     if significant_differences(o, n): 
     changes.append(output_row(o, n)) 

Досадно, это должно работать в Python 2.4, так izip_longest выходит. Также code for izip_longest не работает как необъяснимый следующий не является 2.4-friendly.

Идеально ищет что-то питонское и быстрое, используя генератор, чтобы справиться с потенциально очень большими списками.

+1

'кортеж (карта (следующий, итераторы))' может быть изменен на 'кортежа (i.next() для i в итераторах) 'для Py <= 2.6 это исправляет вашу проблему? В качестве альтернативы 'from operator importcaller'' tuple (map (methodcaller ('next'), итераторы)) ', который может быть немного быстрее – jamylak

+0

Спасибо, что ваша первая строка решила проблему. methodcaller, по-видимому, был введен в 2.6, хотя. –

+0

О, ладно, я отвечу, что в качестве ответа вы можете принять его, если он сработает. – jamylak

ответ

0
tuple(map(next, iterators)) 

может быть изменен на

tuple(i.next() for i in iterators) 

< для Py = 2.6