Двукратная итерация Python
Что такое питонический способ повторения одновременно над двумя списками?
Предположим, что я хочу сравнить два файла по строкам (сравните каждую строку i
th в одном файле с i
-й строкой другого файла), я хотел бы сделать что-то вроде этого:
file1 = csv.reader(open(filename1),...)
file2 = csv.reader(open(filename2),...)
for line1 in file1 and line2 in file2: #pseudo-code!
if line1 != line2:
print "files are not identical"
break
Каков питонический способ достижения этого?
Изменить: Я не использую обработчик файлов, а читатель CSV (csv.reader(open(file),...)
) и zip()
, похоже, не работает с ним...
Окончательное редактирование:, например, @Alex M., zip()
загружает файлы в память на первой итерации, поэтому в больших файлах это проблема. На Python 2 с помощью itertools
решается проблема.
Ответы
Ответ 1
В Python 2 вы должны импортировать itertools и использовать izip:
with open(file1) as f1:
with open(file2) as f2:
for line1, line2 in itertools.izip(f1, f2):
if line1 != line2:
print 'files are different'
break
со встроенным zip
, оба файла будут полностью считываться в память сразу в начале цикла, что может и не быть тем, что вы хотите. В Python 3 встроенный zip
работает как itertools.izip
в Python 2 - постепенно.
Ответ 2
Я голосую за использование zip
. В руководстве предлагается "Зацикливание двух или более последовательностей одновременно, записи могут быть сопряжены с функцией zip()"
Например,
list_one = ['nachos', 'sandwich', 'name']
list_two = ['nachos', 'sandwich', 'the game']
for one, two in zip(list_one, list_two):
if one != two:
print "Difference found"
Ответ 3
В lockstep (для Python ≥3):
for line1, line2 in zip(file1, file2):
# etc.
Как "2D-массив":
for line1 in file1:
for line2 in file2:
# etc.
# you may need to rewind file2 to the beginning.