반응형
range와 enumerate는 상황에 따라 다르게 쓰이기 때문에 무엇이 좋다고 할수는없다.
다만 enumerate를 통해 range에서보다 쉽게 구현이 가능한 코드들이 있다.
range 사용
number = ['1234', '123', '12']
for i in range(len(number)):
print(i)
print(number[i])
결과
0
1234
1
123
2
12
enumerate 사용
for i, value in enumerate(number):
print(i, value)
결과
0 1234
1 123
2 12
훨씬 간결하고 보기좋다
배열 요소 중 문자열이 제일 긴 값 찾는법
range 사용
number = ['1234', '123', '12']
counts = [len(n) for n in number]
longest_number = None
max_number = 0
for i in range(len(number)):
check_number = counts[i]
if check_number > max_number:
longest_number = number[i]
max_number = check_number
print(longest_number)
결과
1234
코드가 너무 길고 이해하기 어렵다
enumerate 사용
for i, number in enumerate(number):
check_number = counts[i]
if check_number > max_number:
longest_number = number
max_number = check_number
조금 나아짐
zip 사용
for number, count in zip(number, counts):
if count > max_number:
longest_number = number
max_number = count
겁나 나아짐
zip은 둘 이상의 *이터레이터를 지연 계산 *제너레이터를 사용해 묶어준다.
(*이터레이터 , * 제너레이터 : https://nirsa.tistory.com/118 참고)
묶어준 number와 counts를 각각 number와 count에 *언패킹 해준다
(*언패킹 : 여러개의 객체를 포함하고 있는 하나의 객체 혹은 여러 객체에 풀어줍니다)
하지만 zip의 단점이 있다.
zip할 number와 counts의 갯수가 맞지 않으면 가장 짧은 입력의 길이만큼만 합쳐진다.
예) zip 입력
['1234', '123', '12']
['abc', 'ab']
결과 ('12'가 버려짐)
('1234', 'abc')
('123', 'ab')
긴 이터레이터의 뒷부분을 버리는 zip 기능이 필요할때도 있다.
이럴땐 itertools 내장 모듈에 들어 있는 zip_longest를 대신 사용한다.
import itertools
numbers = ['1234', '123', '12']
alphas = ['abc', 'ab']
for number, count in itertools.zip_longest(numbers, alphas):
print(f'{number}: {count}')
결과
1234: abc
123: ab
12: None
반응형