Python, zip() 함수 사용: 한 번에 여러 목록의 요소 가져오기

사업

Python의 내장 함수 zip()은 반복 가능한 여러 객체(목록, 튜플 등)의 요소를 결합하고 for 루프에서 여러 목록의 요소를 검색하는 데 사용됩니다.

이 섹션에서는 zip() 함수의 다음 사용법에 대해 설명합니다.

  • for 루프에서 여러 목록의 요소를 가져옵니다.
  • 다른 수의 요소 다루기
    • zip():함수는 너무 많은 요소를 무시합니다.
    • itertools.zip_longest():이 함수는 누락된 요소를 채웁니다.
  • 여러 반복 가능한 요소의 튜플 목록을 가져옵니다.

for 루프에서 여러 목록의 요소를 가져옵니다.

for 루프에서 동시에 여러 반복 가능한 객체(목록, 튜플 등)의 요소를 검색하고 사용하려면 zip() 함수에 대한 인수로 지정합니다.

names = ['Alice', 'Bob', 'Charlie']
ages = [24, 50, 18]

for name, age in zip(names, ages):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18

2개 뿐만 아니라 3개 이상도 있습니다.

points = [100, 85, 90]

for name, age, point in zip(names, ages, points):
    print(name, age, point)
# Alice 24 100
# Bob 50 85
# Charlie 18 90

다른 수의 요소 다루기

zip() 함수는 많은 수의 요소를 무시합니다.

zip() 함수에서 각 목록의 요소 수가 다른 경우 더 적은(짧은) 요소 수까지 반환되고 더 큰 수는 무시됩니다.

names = ['Alice', 'Bob', 'Charlie', 'Dave']
ages = [24, 50, 18]

for name, age in zip(names, ages):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18

itertools.zip_longest() 함수는 누락된 요소를 채웁니다.

표준 라이브러리 itertools 모듈에서 zip_longest()를 사용하면 각 목록의 요소 수가 다를 때 누락된 요소를 임의의 값으로 채울 수 있습니다.

기본적으로 None으로 채워져 있습니다.

from itertools import zip_longest

names = ['Alice', 'Bob', 'Charlie', 'Dave']
ages = [24, 50, 18]

for name, age in zip_longest(names, ages):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18
# Dave None

fillvalue 인수가 지정되면 해당 값으로 채워집니다.

for name, age in zip_longest(names, ages, fillvalue=20):
    print(name, age)
# Alice 24
# Bob 50
# Charlie 18
# Dave 20

누락된 요소가 있는 목록이 여러 개 있더라도 채워야 할 값은 동일합니다. 다른 값을 지정할 수 없습니다.

points = [100, 85]

for name, age, point in zip_longest(names, ages, points, fillvalue=20):
    print(name, age, point)
# Alice 24 100
# Bob 50 85
# Charlie 18 20
# Dave 20 20

zip_longest() 내에서 zip_longest()를 사용하여 다른 값을 지정할 수 있지만 목록의 어떤 요소가 누락되었는지 미리 알아야 하므로 실용적이지 않습니다.

알 수 없는 수의 요소로 여러 목록을 채우고 각각 다른 값을 사용하려는 경우 다음 절차를 고려할 수 있습니다.

  1. 모든 목록에 대해 채울 값을 정의합니다.
  2. 최대 요소 수 얻기
  3. 모든 목록을 최대 요소 수로 채웁니다.
  4. zip() 함수 사용
fill_name = 'XXX'
fill_age = 20
fill_point = 50

len_names = len(names)
len_ages = len(ages)
len_points = len(points)

max_len = max(len_names, len_ages, len_points)

names = names + [fill_name] * (max_len - len_names)
ages = ages + [fill_age] * (max_len - len_ages)
points = points + [fill_point] * (max_len - len_points)

print(names)
print(ages)
print(points)
# ['Alice', 'Bob', 'Charlie', 'Dave']
# [24, 50, 18, 20]
# [100, 85, 50, 50]

for name, age, point in zip(names, ages, points):
    print(name, age, point)
# Alice 24 100
# Bob 50 85
# Charlie 18 50
# Dave 20 50

가장 많은 수의 요소를 채우는 과정에서 다음을 수행합니다.

  • 임의의 값과 요소 수로 목록 초기화
  • + 연산자를 사용하여 목록을 함께 결합

이것을 함수로 바꾸면 이렇습니다. 원래 목록과 목록을 채우는 값은 각각 iterable(목록 또는 튜플) 인수로 지정됩니다.

def my_zip_longest(iterables, fillvalues):
    max_len = max(len(i) for i in iterables)
    return zip(*[list(i) + [v] * (max_len - len(i)) for i, v in zip(iterables, fillvalues)])

for name, age, point in my_zip_longest((names, ages, points), ('XXX', 20, 50)):
    print(name, age, point)
# Alice 24 100
# Bob 50 85
# Charlie 18 50
# Dave 20 50

목록 이해 표기법과 *에 의한 목록 확장을 사용합니다.

여러 반복 가능한 요소의 튜플 목록을 가져옵니다.

zip() 함수는 여러 반복 가능한 객체 요소의 튜플인 반복자(zip 객체)를 반환합니다.
for 루프 외부에서도 사용할 수 있으며 대상은 목록에 국한되지 않습니다.

names = ['Alice', 'Bob', 'Charlie']
ages = (24, 50, 18)

z = zip(names, ages)
print(z)
print(type(z))
# <zip object at 0x10b57b888>
# <class 'zip'>

여러 반복 가능한 객체의 요소 목록을 튜플로 얻으려면 list()를 사용하여 목록을 만드십시오.

l = list(zip(names, ages))
print(l)
print(type(l))
print(type(l[0]))
# [('Alice', 24), ('Bob', 50), ('Charlie', 18)]
# <class 'list'>
# <class 'tuple'>
Copied title and URL