Подтвердить что ты не робот

Двукратная итерация 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 решается проблема.

4b9b3361

Ответ 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.