리스트 컴프리헨션을 사용하면 소스 list에서 새로운 list를 파생시키기 쉽다.
names = ['Cecilia', '남궁민수', '어쩌고']
counts = [len(n) for n in names]
print(counts)
[7, 4, 3]
두 리스트를 동시에 이터레이션할 경우 names 소스 리스트의 길이를 사용해 이터레이션할 수 있다.
longest_name = None
max_count = 0
for i in range(len(names)):
count = counts[i]
if count > max_count:
longest_name = names[i]
max_count = count
print(longest_name)
Cecilia
어지럽다
enumerate를 사용해보자
for i, name in enumerate(names):
count = counts[i]
if count > max_count:
longest_name = name
max_count = count
zip을 사용해보자
zip은 둘 이상의 이터레이터를 지연 계산 제너레이터를 사용해 묶어준다.
for name, count in zip(names, counts):
if count > max_count:
longest_name = name
max_count = count
zip은 자신이 감싼 이터레이터 중 어느 하나가 끝날때까지 튜플을 내놓는다.
names.append('Rosalind')
for name, count in zip(names, counts):
print(name)
Cecilia 남궁민수 어쩌고
zip에 전달한 리스트의 길이가 같지 않을 것으로 예상한다면 itertools 내장 모듈에 들어 있는 zip_longest를 대신 사용하는 것을 고려하라.
import itertools
for name, count in itertools.zip_longest(names, counts):
print(f'{name}: {count}')
Cecilia: 7 남궁민수: 4 어쩌고: 3 Rosalind: None
zip_longest는 존재하지 않는 값을 자신에게 전달된 fillvalue로 대신한다. 디폴트는 None이다
for name, count in itertools.zip_longest(names, counts, fillvalue=1):
print(f'{name}: {count}')
Cecilia: 7 남궁민수: 4 어쩌고: 3 Rosalind: 1