◎ Python/알게된 것 정리

[Python 정리] 내장함수 zip, filter에 대하여

reo91004 2022. 9. 26. 22:17
반응형

zip

기본적인 사용법

반복 가능한(iterable) 객체에 대한 처리를 수행하는 알게 된 지 얼마 안된 내장 함수다.

zip은 여러 개의 이터러블을 받아 튜플로 반환하는 이터레이터를 만든다. 예시로 보자.

 

x = [1, 2, 3]
y = [4, 5, 6]

arr = zip(x, y)
print(arr)

>>>
<zip object at 0x000001D42F322B00>

바로 출력하면 내부 요소가 보여지기 않기 때문에 리스트나 딕셔너리로 변환해서 출력해야 한다.

 

x = [1, 2, 3]
y = [4, 5, 6]

arr = list(zip(x, y))
print(arr)

>>>
[(1, 4), (2, 5), (3, 6)]

정상적으로 요소들이 튜플로 묶여있는 모습을 볼 수 있다.

 

유용한 방법 1 (병렬 처리)

zip으로 생각보다 다양한 작업을 처리할 수 있다. 대표적으로 병렬 처리를 할 수 있는데, 인자로 여러 개를 줄 수 있어서 가능하다 아래 예시 2개를 참고하자.

 

x = [[1, 2, 3], [4, 5, 6]]
y = ['A', 'B']

arr = zip(y, x)

for i, *v in arr: # 언패킹을 통한 배열 주기
    print(i, *v)
    
>>>
A [1, 2, 3]
B [4, 5, 6]

 

x = [[1, 2, 3], [4, 5, 6]]
y = ['A', 'B']

arr = zip(y, x)

for x, y, z in zip("123", "456", "789"): # 문자열도 알아서 대입한다.
    print(x, y, z)
    
>>>
1 4 7
2 5 8
3 6 9

 

유용한 방법 2 (Unpacking을 통한 활용법)

zip으로 묶었으면 당연히 풀 수도 있다. 앞에 unpacking 연산자를 붙이면 된다. 아래 예시로 보자.

 

x = [["홍길동", "김철수", "박찬호"], [21, 63, 42]]
y = ["이름", "나이"]

arr = dict(zip(y, x))

print("list(zip(*arr.items()))", list(zip(*arr.items())))
print("list(zip(*arr.values())) : ", list(zip(*arr.values())), end="\n")

for i in zip(*arr.values()):
    print("요소 출력 : ", *i)


>>>
list(zip(*arr.items())) [('이름', '나이'), (['홍길동', '김철수', '박찬호'], 
[21, 63, 42])]
list(zip(*arr.values())) :  [('홍길동', 21), ('김철수', 63), ('박찬호', 42)]

요소 출력 :  홍길동 21
요소 출력 :  김철수 63
요소 출력 :  박찬호 42

예시로 적어둔 list(zip(*arr.items())), list(zip(*arr.values()))와 for문 예시를 찬찬히 뜯어보면 도움이 될 거라 생각한다.

 

 

filter

filter()는 조건에 맞는 요소만 포함한 이터레이터를 반환하는 내장 함수다.

필터링 조건은 인수를 하나만 받은 함수를 첫 번째 인수로 지정하고, 두 번째 인수는 이터러블을 주면 된다.

 

이 내장함수도 내부 요소를 보려면 list로 변환해서 출력해주어야 한다.

 

var = (1, 2, 3, 4, 5)

print(list(filter(lambda x : x > 2, var))) # 2보다 큰 값들만 출력

>>>
[3, 4, 5]

 

 

반응형