늒네 기록

[python] zip() 함수에 대하여 - 2 본문

언어 공부 기록/python

[python] zip() 함수에 대하여 - 2

jaeha lee 2020. 10. 9. 21:32

2020/10/09 - [언어 공부 기록/python] - [python] unzip()함수는 없을까? 앞선 글에서 아래의 상황을 마주쳤다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
= [1234]
= ['a''b''c''d''e']
= ['foo''bar''baz']
 
= zip(a, b, c)
 
print(y) # <zip object at 0x00D47E88>
print(list(y)) # [(1, 'a', 'foo'), (2, 'b', 'bar'), (3, 'c', 'baz')]
 
aa, bb, cc = zip(*y)
'''
Traceback (most recent call last):
  File "cf.py", line 10, in <module>
    aa, bb, cc = zip(*y)
ValueError: not enough values to unpack (expected 3, got 0)
'''
# print(aa, bb, cc)
cs

그리고, 아래와 같이 코드를 짜면 작동하는 것을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
= [1234]
= ['a''b''c''d''e']
= ['foo''bar''baz']
 
= zip(a, b, c)
 
print(y) # <zip object at 0x00D47E88>
#print(list(y)) # [(1, 'a', 'foo'), (2, 'b', 'bar'), (3, 'c', 'baz')]
 
aa, bb, cc = zip(*y)
print(aa, bb, cc) # (1, 2, 3) ('a', 'b', 'c') ('foo', 'bar', 'baz')
cs

둘의 차이는, 8번 줄을 주석처리 했는지의 여부밖에 없다. 이 사실을 찾아내는 데에 성공했다면, 처음의 코드에서 에러가 발생한 이유를 쉽게 알 수 있다. 첫 코드에서는,

- 5번 줄에서 y에 zip 오브젝트를 만들어서 넣어주었다.

- 7번 줄에서 y가 뭔지 출력해보았다. zip 오브젝트가 들어있다고 나온다.

- 8번 줄에서 y를 리스트로 형변환을 해서 출력해보았다. 이때, 형변환 과정에서 zip 오브젝트에 있는 아이템을 순차적으로 돌면서 리스트를 만들고, 이를 출력했다.

- 10번 줄에서 y에 있는 내용물을 zip 함수에 넣어주려고 했는데, 앞서 8번 줄에서 아이템을 순차적으로 돌면서 이미 zip 오브젝트의 끝에 도달했기 때문에, 더 이상 넣어줄 아이템이 없다. 즉, zip 오브젝트는 generator 오브젝트처럼 이전 아이템으로 되돌아가는 것이 불가능하다!

 

그렇다면 zip오브젝트의 내용물을 재활용하고 싶다면 어떻게 해야할까? 가장 간단한 방법은 아래처럼 zip 오브젝트를 list로 바꿔놓은 걸 변수에 저장해놓고, list를 계속해서 사용하는 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
= [1234]
= ['a''b''c''d''e']
= ['foo''bar''baz']
 
= zip(a, b, c)
 
print(y) # <zip object at 0x00D47E88>
= list(y)
print(y) # [(1, 'a', 'foo'), (2, 'b', 'bar'), (3, 'c', 'baz')]
 
aa, bb, cc = zip(*y)
print(aa, bb, cc) # (1, 2, 3) ('a', 'b', 'c') ('foo', 'bar', 'baz')
cs

8번 줄에서 zip으로 되어있던 y를 list로 변환해주었기 때문에, 9번, 11번 줄에서 y의 내용물을 읽어와서 사용해도 앞서 발생했던 문제가 생기지 않는다.

반응형
Comments