2010-03-06 4 views
12

동시에 두리스트를 반복하는 파이썬 적 방법은 무엇입니까?파이썬 이중 반복

은 가정하자 내가 선으로 두 파일 라인을 비교하려면 (다른 파일의 i 번째 라인에 하나 개의 파일에있는 각 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을 사용하면 문제가 해결됩니다.

+0

[가능한 두 개의 목록을 파이썬에서 병렬로 반복 할 수 있습니까?] (http://stackoverflow.com/questions/1663807/how-can-iterator-through-two-lists-in-parallel -in-python) –

답변

13

파이썬 2에서 제안, 당신은 itertools를 가져와야합니다 및 사용의 izip : 내장 zip, 두 파일은 완전히 당신이 원하는하지 않을 수 루프의 시작에서 한 번에 메모리에 읽을 수 있습니다와

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 

. 파이썬 3에서 내장형 zip은 파이썬 2에서 점진적으로 수행합니다. itertools.izip처럼 작동합니다.

+0

이것은 일을합니다! 실제로 문제는 파일이 꽤 커서 zip()이 메모리에 모든 파일을로드하는 것이 었습니다. –

+0

아, 아마도 그것이 내가 차이점을 보지 못한 이유입니다. 파이썬 3.1을 사용하고 있습니다. – kennytm

+0

@KennyTM, yep, no "maybe": 파이썬 3에서는 파이썬 2에서 메모리 내 모든리스트에 의존했던 많은 것들이 점진적이고 반복적 인 것으로 나타났습니다. 따라서 질문과 대답이 Python 2 또는 Python 3과 관련되어 있는지 항상 명확히하는 것이 중요합니다. Python 2에서 (더 나은 ;-) 증분 반복적 접근 방식은 말하자면 명시 적으로 이해해야합니다.), 파이썬 3에서는 본질적이다. (당신이 명시 적으로 **리스트를 원한다면 상대적으로 드문 경우에'list'를 명시 적으로 호출해야한다. –

3

록 스텝에서 (파이썬 ≥3) :

for line1, line2 in zip(file1, file2): 
    # etc. 

는 "2 차원 배열"로 :

for line1 in file1: 
    for line2 in file2: 
    # etc. 
    # you may need to rewind file2 to the beginning. 
+0

감사합니다. lockstep 메서드를 찾고 있습니다. 왜이 방법이'csv.reader()'에 대해 작동하지 않는지 아는 것이 있습니까? –

+0

어쩌면 당신은 "2D 배열"에 대해 내부 반복자를 다시 초기화해야 할 필요가 있음을 분명히해야합니다 ... – fortran

+1

@Yuval, (1 ?!) CSV로 zip을 사용하려고하는 방법을 정확하게 보여주기 위해 답을 편집하십시오 .reader -이 댓글은 완전히 신비합니다. –

6

내가 zip를 사용하기위한 투표. manual는, 예를 들어

"동시에 두 개 이상의 시퀀스를 반복 할 경우 항목은 우편() 함수와 결합 될 수있다"

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"