일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- lower_case_table_names
- 자료구조
- 네이밍
- python
- 큰 수 나누기
- 파이썬
- 2557
- itertools
- Dictionary
- datetime
- 리스트 컴프리헨션
- timestamp
- list comprehension
- Codeforces
- 세그먼트 트리
- enumerate
- FOREIGN KEY
- 에라토스테네스의 체
- SUM()
- project euler
- ceil
- floor
- 딕셔너리
- mysql
- BOJ
- convention
- flask
- SUM
- 외래키
- 소수
Archives
- Today
- Total
늒네 기록
[python] zip() 함수에 대하여 - 2 본문
2020/10/09 - [언어 공부 기록/python] - [python] unzip()함수는 없을까? 앞선 글에서 아래의 상황을 마주쳤다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
a = [1, 2, 3, 4]
b = ['a', 'b', 'c', 'd', 'e']
c = ['foo', 'bar', 'baz']
y = 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
|
a = [1, 2, 3, 4]
b = ['a', 'b', 'c', 'd', 'e']
c = ['foo', 'bar', 'baz']
y = 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
|
a = [1, 2, 3, 4]
b = ['a', 'b', 'c', 'd', 'e']
c = ['foo', 'bar', 'baz']
y = zip(a, b, c)
print(y) # <zip object at 0x00D47E88>
y = 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의 내용물을 읽어와서 사용해도 앞서 발생했던 문제가 생기지 않는다.
반응형
'언어 공부 기록 > python' 카테고리의 다른 글
[python] 프로젝트 구조 짜기 - 1 (0) | 2022.09.04 |
---|---|
[python] list.sort(), 혹은 sorted()에서의 key에 대하여 (0) | 2020.10.16 |
[python] unzip()함수는 없을까? (0) | 2020.10.09 |
[python] zip() 함수에 대하여 (0) | 2020.10.09 |
[python] lambda와 reduce의 활용을 통한 리스트 아이템의 곱 구하기 (0) | 2020.10.01 |
Comments