python/기초

[파이썬 기초] 반복문 - enumerate, zip

끼발자 2021. 9. 7. 16:56
반응형

모든 언어에서 반복문은 중요하다.

가장 먼저 배우는 문법이 변수선언 뒤에 반복문이니까.

 

자바 개발자인 아는 분께서 반복문에 인덱스를 다음과 같이 작성한 것을 보고

포스팅한다.

 

enumerate

i = 0 
for item in items:
	...
    ...
    ...
    i += 1

위의 코드가 잘못되었다는 말이 아니다.

어디까지나 직관적인 코드고, 파이썬스럽지 않을뿐이니까.

 

자 위의 코드를 좀 더 파이썬스럽게 고쳐보자

for i,item in enumerate(items):
	...
    ...
    ...

i를 선언하고 더해주는 과정 필요없이, enumerate라는 메서드를 사용하면

하나의 루프가 돌 때마다 i가 1씩 추가된다.

루프를 도는데 인덱스가 필요하다면 이런식으로 코드를 짜보자.

 

zip

우리에게 친숙한 압축 확장자 zip이다.

이 또한 반복문에서 유용하게 사용 가능하다.

subject = ['국어','영어','수학','사회']
score = [87,94,100,64]

for i in zip(subject,score):
	print(*i)
  
#국어 87
#영어 94
#수학 100
#사회 64

과목을 담은 리스트 subject / 점수를 담은 리스트 score 가 있다고 할 때,

과목 - 점수를 반복문으로 출력하고자 하면 위와 같이 적어주면 된다.

 

물론

for i in range(len(subject)):
	print(subject[i],score[i])

#국어 87
#영어 94
#수학 100
#사회 64

와 같이 만들 수도 있다. 

 

우리는 과목 - 점수 리스트의 길이가 동일하다는 것을 알고 있으므로

아래에 배열의 길이로 인덱싱하는 경우를 사용할 수 있지만,

만약 두 리스트의 길이가 다르다면 list index out of range 에러를 볼 수 있다.

 

zip 메서드를 사용하면, 쌍이 맞는 인덱스까지만 매칭한다.

 

위에서는 두가지 리스트만 zip에 넣어줬다. 세 개 이상을 넣을 수 있을까?

 

있다.

 

subject = ['국어','영어','수학','사회']
score = [87,94,100,64]
grade = ['B+','A','A+','C']
for i in zip(subject,score,grade):
	print(*i)
    
#국어 87 B+
#영어 94 A
#수학 100 A+
#사회 64 C

세개도 된다. 여기서도 물론 세 쌍이 모두 맞아야 반복문에 들어가고 출력한다.

 

 

더보기

추가적으로 zip으로 반복문을 묶어주면 기본적인 return은 tuple이다.

print문 앞에 *를 넣어주면 unzip

즉 튜플형태를 풀어주므로 예쁘게 출력된다.

print(*i) 하지 않고, print(i)를 하게되면,

('국어', 87, 'B+')
('영어', 94, 'A')
('수학', 100, 'A+')
('사회', 64, 'C')

이런 형태가 출력된다.

 

앞선 포스트 리스트 컴프리헨션에서도 응용이 가능한데,

student = ['김XX','이OO','박OX','최XO']
list_ = [i for i in enumerate(student)]
#[(0, '김XX'), (1, '이OO'), (2, '박OX'), (3, '최XO')]

이런식으로 각각의 이름에 인덱스를 넣은 배열을  넣어준다던지,

student = ['김XX','이OO','박OX','최XO']
list_ = [i for i in zip(range(10),student)]

 

이렇게 zip으로 range를 통해서 넣어줄 수 있다. 모두 같은 결과를 내뱉는다.

 

반응형