EXCELSIOR

내장함수 zip() 과 itertools.zip_longest() 함수 본문

Python/자료구조

내장함수 zip() 과 itertools.zip_longest() 함수

Excelsior-JH 2017. 9. 21. 20:40
Python - Built in Function : zip(*iterables)

Python에는 다양한 내장함수(Built-in Function)를 제공한다. 그 중에서 알아두면 유용한 내장함수인 zip() 함수를 알아보도록 하자.

1. zip(*iterables) 함수

  • zip() 함수는 동일한 개수로 이루어진 자료형을 묶어주는 역할을 하는 함수이다.(점프투파이썬) 아래의 그림처럼 각 자료형의 i-th 에 해당하는 요소(elements)를 묶어주는 함수이다. 자세한 내용은 docs.python.org에서 확인할 수 있다.



[예제1]의 소스코드를 통해 zip()에 대해 자세히 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 예제1 - zip()예제
## 1) list 형
= [123]
= [456]
 
zipped = zip(x, y)
print(list(zipped))
'''
결과
[(1, 4), (2, 5), (3, 6)]
'''
 
= [789]
zipped2 = zip(x, y, z)
print(list(zipped2))
'''
결과
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
'''
 
## 2) str 형
= 'abc'
= 'def'
 
zipped3 = zip(a, b)
print(list(zipped3))
'''
결과
[('a', 'd'), ('b', 'e'), ('c', 'f')]
'''
cs

2. zip() 활용 예제

zip()을 이용해서 Dictionary의 {key: value}  value 값으로 최대값과 최소값, 그리고 정렬을 하는데 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 예제2 - zip()을 이용한 Dictionary의 value기준으로 
# 최소(min), 최대(max)값 찾기 및 정렬하기
# 1) 최소, 최대값 찾기
 
= {'banana'3'apple'4'pear'1'orange':2}
 
min_item = min(zip(d.values(), d.keys()))
max_item = max(zip(d.values(), d.keys()))
print(min_item)
print(max_item)
'''
결과
(1, 'pear')
(4, 'apple')
'''
 
# 2) 오름차순으로 정렬하기
d_sorted = sorted(zip(d.values(), d.keys()))
print(d_sorted)
'''
결과: [(1, 'pear'), (2, 'orange'), (3, 'banana'), (4, 'apple')]
'''
d_sorted2 = sorted(d.items(), key= lambda t:t[1])
print(d_sorted2)
'''
결과: [('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]
'''
cs

[예제2-2]에서 zip() 함수를 사용하여 오름차순으로 정렬한 결과와 sorted() key 를 사용하여 정렬한 결과는 튜플의 값의 위치만 다를뿐 오름차순 정렬 결과는 같다.

3. itertools.zip_longest(*iterables, fillvalue=None)

만약, 길이가 다른 경우 (예를들어, x = [1, 2, 3], y = [4, 5, 6, 7] 일때), zip()을 사용하면 어떻게 될까? 아래의 [예제3]에서 리스트 y의 요소(element)인 7 은 제외되는것을 볼 수 있다.

1
2
3
4
5
6
7
8
9
10
# 예제3 - 길이가 다른 자료형에 zip() 함수 적용
= [123]
= [456,7]
 
zipped = zip(x, y)
print(list(zipped))
'''
결과
[(1, 4), (2, 5), (3, 6)]
'''
cs

이렇게 길이가 다른 경우의 자료형에는 itertools.zip_longest()를 사용하면 된다. docs.python.org에서 살펴보면 길이가 다른 자료형인 경우 zip_longest(*iterables, fillvalue=None) fillvalue= 인자에 값을 지정하여 zip() 함수를 적용해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 예제4 - itertools.zip_longest를 이용하여 길이가 다른 자료형 zip() 적용
 
from itertools import zip_longest
 
= [123]
= [456,7]
 
# 1) zip_longest 적용
zipped = zip_longest(x, y)
print(list(zipped))
'''
결과
[(1, 4), (2, 5), (3, 6), (None, 7)]
'''
 
# 2) fillvalue= 인자에 값을 지정
zipped = zip_longest(x, y, fillvalue=0)
print(list(zipped))
'''
결과
[(1, 4), (2, 5), (3, 6), (0, 7)]
'''
cs


'Python > 자료구조' 카테고리의 다른 글

collections 모듈 - OrderedDict  (0) 2017.09.07
collections 모듈 - namedtuple  (5) 2017.08.22
collections 모듈 - deque  (3) 2017.08.20
collections 모듈 - defaultdict  (0) 2017.08.18
collections 모듈 - Counter  (7) 2017.08.17
Comments