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