리스트 컴프리헨션을 이용해서 소스 list에서 새로운 리스트를 만들기 쉽다.
make_string = ["hi","world","python"]
counts = [len(n) for n in make_string]
print(counts)
➜
[2, 5, 6]
두 리스트를 동시에 이터레이션할 경우 make_string 소스 리스트의 길이를 사용해 이터레이션할 수 있다.
longest_string = None
max_count = 0
for i in range(len(make_string)):
count = counts[i]
if count > max_count:
longest_string = make_string[i]
max_count = count
print(longest_string)
이런식으로 코드를 작성하면 가독성이 좋지 않다. 배열 인덱스 i를 사용해 배열 원소를 가져오는 연산이 두 번 일어난다. enumerate를 사용하면 약간 나아지지만, 이 코드도 여전히 이상적이지는 않다.
for i, new_string in enumerate(make_string):
count = counts[i]
if count > max_count:
longest_string = new_string[i]
max_count = count
✍🏻 이런 코드를 더 깔끔하게 만들 수 있도록 파이썬은 zip이라는 내장 함수를 제공한다.
zip은 둘 이상의 이터레이션를 지연 계산 제너레이터를 사용해 묶어준다. zip 제너레이터는 각 이터레이터의 다음 값이 들어 있는 튜플을 반환한다. zip 제너레이터는 각 이터레이터의 다음 값이 들어 있는 튜플을 반환한다.
for new_string, count in zip(make_string, counts):
if count > max_count:
longest_string = new_string
max_count = count
🤔주의사항
zip을 사용하는데 make_string의 값을 추가했는데 counts은 추가하지 않으면 출력되지 않는다.
make_string.append("javascript")
for new_string, count in zip(make_string, counts):
print(new_string)
➜
hi
world
python
이러한 문제를 해결하기 위해서 itertools 내장 모듈에 들어 있는 zip_longest를 대신 사용하하는 것이 좋다.
import itertools
for new_string, count in itertools.zip_longest(make_string, counts):
print(f'{new_string} : {count}')
➜
hi : 2
world : 5
python : 6
javascript : None
zip_longest는 존재하지 않는 값을 자신에게 전달된 fillvalue로 대신한다. 디폴트 fillvalue는 None이다.