[Python] 내장함수 enumerate, zip

cdwde·2021년 5월 7일
0

🎈 enumerate

  • 순서가 있는 자료형(리스트, 튜플, 문자열)을 입력받아 인덱스 값을 포함하는 enumerate 객체를 돌려줌
e = enumerate(['A', 'B', 'C'])
print(e)

#출력 결과
#<enumerate object at 0x01C1B9A8>

  • 인자로 넘어온 목록을 기준으로 인덱스와 원소를 차례대로 접근하게 해주는 iterator 객체를 반환
e = enumerate(['A', 'B', 'C'])
print(next(e))
print(next(e))
print(next(e))

l = list(enumerate(['A', 'B', 'C'])
print(l)

#출력 결과
#(0, 'A')
#(1, 'B')
#(2, 'C')
#[(0, 'A'), (1, 'B'), (2, 'C')]

  • 인덱스와 원소를 동시에 접근하면서 루프 돌릴 때 사용
  • for문처럼 반복되는 구간에서 객체가 현재 어느 위치에 있는지 알려주는 인덱스 값이 필요할 때 사용하면 유용
for e in enumerate(['A', 'B', 'C']):
    print(e)

#출력 결과
#(0, 'A')
#(1, 'B')
#(2, 'C')

  • 인덱스, 원소로 이루어진 튜플 만들어줌
    => 인덱스, 원소 각각 다른 변수에 할당하고 싶으면 unpacking하기
for idx, letter in enumerate(['A', 'B', 'C']):
    print(idx, letter)
    
#출력 결과
#0 A
#1 B
#2 C

시작인덱스 바꾸기
start 인자에 시작하고 싶은 숫자 넘기기

for idx, letter in enumerate(['A', 'B', 'C'], start = 1):
    print(idx, letter)
    
#출력 결과
#1 A
#2 B
#3 C

🎈 zip

zip(*iterable)

  • 여러개의 iterable 객체를 인자로 받고 각 객체가 담고 있는 원소를 튜플 형태로 차례로 접근할 수 있는 iterator를 반환
  • iterable 객체들의 길이가 다를 경우 가장 짧은 객체 기준으로 zip 객체 만들어짐
nums = [1, 2, 3]
letters = ['A', 'B', 'C']
for pair in zip(nums, letters):
    print(pair)
    
#출력 결과
#(1, 'A')
#(2, 'B')
#(3, 'C')

unzip

nums = (1, 2, 3)
letters = ('A', 'B', 'C')
pairs = list(zip(nums, letters))
print(pairs)

#unzip
nums, letters = zip(*pairs)
print(nums)
print(letters)

#출력 결과
#[(1, 'A'), (2, 'B'), (3, 'C')]
#(1, 2, 3)
#('A', 'B', 'C')

언제 사용하면 유용?

병렬 처리

for num, upper, lower in zip("12345", "ABCDE", "abcde"):
    print(num, upper, lower)
    
#출력 결과
#1 A a
#2 B b
#3 C c
#4 D d
#5 E e

사전 변환

keys = [1, 2, 3]
values = ['A', 'B', 'C']
print(dict(zip(keys, values)))

#출력 결과
#{1: 'A', 2: 'B', 3: 'C'}

참고
https://wikidocs.net/32#enumerate
https://www.daleseo.com/python-enumerate/
https://www.daleseo.com/python-zip/
https://velog.io/@rosewwross/Python-%EB%82%B4%EC%9E%A5%ED%95%A8%EC%88%98-%EC%A0%95%EB%B3%B5%ED%95%98%EA%B8%B0-1-of-14#1-enumerate

0개의 댓글