Coding Diary.

(파이썬) 반복문에서 편리하게 사용가능한 zip과 enumerate 내장 함수 본문

Coding/Python

(파이썬) 반복문에서 편리하게 사용가능한 zip과 enumerate 내장 함수

life-of-nomad 2024. 6. 10. 13:02
728x90
반응형
저번 글에서 for 반복문과 while 반복문에서 break와 continue를 사용하는 방법에 대해 알아보았습니다. 이번 글에서는 반복문에서 편리하게 사용할 수 있는 zip과 enumerate 함수에 대해 알아보겠습니다.

 

🔻(참고) break, continue 🔻

 

(파이썬) for 반복문과 while 반복문에서 break 와 continue 사용하기

앞의 글에서 for 반복문과 while 반복문, for 반복문과 while 반복문의 차이점에 대해서 알아보았습니다. 이번 글에서는 반복문이 종료되거나 반복을 통제해야 하는 경우 사용하는 break와 continue에 대

life-of-nomad.tistory.com

1. zip

  • zip은 다수의 iterable을 조합하여 하나의 튜플 열을 만드는 iterator(반복자)을 리턴합니다. 
  • 각각의 튜플에는 모든 iterable 에서 나온 위치에 있는 요소들이 담겨 있습니다.
  • 요소들을 보려면 리스트로 변환하면 됩니다. 
  • 예를 들어, 아래와 같이 리스트를 만들기 위해 결합하는 경우 zip 함수를 사용해보겠습니다.
items = ['bananas', 'mattresses', 'dog kennels', 'machine', 'cheeses']

weights = [15, 34, 42, 120, 5]

print(list(zip(items, weights)))
>>> [('bananas', 15), ('mattresses', 34), ('dog kennels', 42), ('machine', 120), ('cheeses', 5)]
  • 또는, range로 값들을 출력하려면 for 반복문을 사용하여 순회하면 됩니다. 
items = ['bananas', 'mattresses', 'dog kennels', 'machine', 'cheeses']

weights = [15, 34, 42, 120, 5]

for cargo in zip(items, weights):
    print(cargo[0], cargo[1])
    
>>> [('bananas', 15), ('mattresses', 34), ('dog kennels', 42), ('machine', 120), ('cheeses', 5)]
  • 반대로, 별표(*)를 사용하여 리스트를 압축을 해제하여 튜플로 만들 수도 있습니다.
manifest = [('bananas', 15), ('mattresses', 34), ('dog kennels', 42), ('machine', 120), ('cheeses', 5)]

items, weights = zip(*manifest)

print(item)
print(weights)

>>> ('bananas', 'mattresses', 'dog kennels', 'machine', 'cheeses')
    (15, 34, 42, 120, 5)
  • 이런 식으로 항목과 무게로 분리할 수 있습니다.

 

2. enumerate 

  • enumerate는 리스트의 인덱스와 값이 담긴 튜플로 이루어진 iterator을 리턴하는 내장 함수입니다.
items = ['bananas', 'mattresses', 'dog kennels', 'machine', 'cheeses']

for i, item in zip(range(len(items)), items):
    print(i, item)
    
>>> 0 bananas
    1 mattresses
    2 dog kennels
    3 machine
    4 cheeses
  • 위의 코드를 enumerate를 이용하여 훨씬 간단하게 할 수 있습니다.
items = ['bananas', 'mattresses', 'dog kennels', 'machine', 'cheeses']

for i, item in enumerate(items):
    print(i, items)
    
>>> 0 bananas
    1 mattresses
    2 dog kennels
    3 machine
    4 cheeses
  • enumerate는 이러한 튜플들을 순회할 수 있는 iterable 형식으로 반환하며 해당 튜플들은 리스트의 인덱스들과 리스트의 값을 반환합니다.

 

3. 연습문제

(1) 아래의 리스트를 label : x, y, z 형태로 만들기

x_coord = [23, 53, 2, -12, 95, 103, 14, -5]
y_coord = [677, 233, 405, 433, 905, 376, 432, 445]
z_coord = [4, 16, -6, -42, 3, -6, 23, -1]
labels = ["F", "J", "A", "Q", "Y", "B", "W", "X"]
points = []

for point in zip(labels, x_coord, y_coord, z_coord):
    points.append("{}: {}, {}, {}".format(*point))
    
for point in points:
    print(point)
    
>>> F: 23, 677, 4
    J: 53, 233, 16
    A: 2, 405, -6
    Q: -12, 433, -42
    Y: 95, 905, 3
    B: 103, 376, -6
    W: 14, 432, 23
    X: -5, 445, -1

 

(2) 아래의 리스트를 딕셔너리로 만들기

cast_names = ["Barney", "Robin", "Ted", "Lily", "Marshall"]
cast_heights = [72, 68, 72, 66, 76]

cast = dict(zip(cast_names, cast_heights))
print(cast)

>>> {'Barney': 72, 'Robin': 68, 'Ted': 72, 'Lily': 66, 'Marshall': 76}

 

(3) cast 튜플을 names, hieghts로 다시 unzip 하기

cast = (("Barney", 72), ("Robin", 68), ("Ted", 72), ("Lily", 66), ("Marshall", 76))

names, heights = zip(*cast)
print(names)
print(heights)

>>> ('Barney', 'Robin', 'Ted', 'Lily', 'Marshall')
    (72, 68, 72, 66, 76)

 

(4) zip을 transpose 하기

# data는 튜플들의 튜플
data = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11))

# *data = (0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11) 로 언패킹
# zip함수로 동일한 위치에 있는 요소끼리 묶어서 튜플 (0, 3, 6, 9), (1, 3, 7, 10), (2, 5, 8, 11)로 반환
# tuple로 이 결과를 다시 튜플로 변환
data_transpose = tuple(zip(*data))
print(data_transpose)
>>> ((0, 3, 6, 9), (1, 4, 7, 10), (2, 5, 8, 11))

 

(5) enumerate 로 cast 와 heights 리스트 만들기

cast = ["Barney Stinson", "Robin Scherbatsky", "Ted Mosby", "Lily Aldrin", "Marshall Eriksen"]
heights = [72, 68, 72, 66, 76]

# enumerate 함수를 사용하여 cast 리스트의 각 요소에 대해 인덱스 i와 값 character 가져오기
# 각 캐릭터 이름에 해당 인덱스 키를 문자열로 변환하여 결합한 후 이를 cast 리스트의 해당 위치에 다시 저장
for i, character in enumerate(cast):
    cast[i] = character + " " + str(heights[i])  

print(cast)
>>> ['Barney Stinson 72', 'Robin Scherbatsky 68', 'Ted Mosby 72', 'Lily Aldrin 66', 'Marshall Eriksen 76']

 

728x90
반응형