Python fillvalue 값 여러개 설정 방법

파이썬에서 복수의 오브젝트 또는 리스트 등을 zip_longest로 동시에 취득하는 경우 fillvalue을 사용해 기본값을 설정하는 경우가 있습니다.

동시에 취득하는 리스트가 2개인 경우에는 fillvalue에 값을 설정하면 요소수가 작은 나머지 리스트 값에는 fillvalue에 설정한 값이 대입됩니다.

3개 이상의 리스트에서도 fillvalue을 사용해 기본값을 설정할 수 있지만 각각의 리스트에 다른 값을 대입하지는 못합니다.

지정한 값이 모든 리스트에 적용이 됩니다.

from itertools import zip_longest

names = ['Alice', 'Bob', 'Charlie', 'Dave']
ages = [24, 50, 18]
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

 

리스트 요소가 적은 변수 ages와 points에는 fillvalue에 설정한 값인 20이 대입되어 출력됐습니다.

만약 ages에는 20을 points에는 50을 대입시키고 싶은 경우에는 먼저 모자란 요소에 값을 대입시켜주는 처리를 해야 합니다.

샘플을 보도록 하겠습니다.

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

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)


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

 

샘플 소스의 처리를 보면 요소수가 모자란 리스트에 대입할 값을 fill_name, fill_age, fill_point 변수로 만들었습니다.

각 리스트의 길이를 len 함수를 사용해 취득했습니다.

취득한 리스트의 길이를 max 함수를 사용해 가장 큰 리스트 요소의 개수를 구합니다.

각각의 리스트에 +연산자를 사용해 가장 길이가 큰 리스트 길이만큼 값을 추가합니다.

값 추가가 끝나면 모든 리스트의 길이는 같아집니다.

마지막으로 for 문과 zip 함수를 사용해 모든 리스트를 동시에 취득해 출력합니다.

샘플 소스를 조금 더 간략하고 재사용 하기 편하게 함수로 만들 수도 있습니다.

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)])

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

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

 

my_zip_longest 함수를 만들었습니다.

만든 함수에서는 리스트가 길이가 가장 큰 요소에 맞춰 설정하고 싶은 값을 각각의 리스트에 설정합니다.

처리하는 내용은 가장 처음에 본 예제와 같습니다.

함수로 만들어 놓으면 동시에 출력하고 싶은 리스트 수가 많아져도 재사용하기에 편리합니다.

댓글