본문 바로가기
책 리뷰/파이썬 알고리즘 인터뷰

[Python] zip()함수와 * 활용

by 조조링 2024. 11. 11.
728x90
반응형

 

 

zip() 함수

  • zip() 함수는 2개 이상의 시퀀스(리스트, 튜플 등)를 짧은 길이를 기준으로 일대일 대응하는 새로운 튜플 시퀀스를 만든다.
a = [1,2,3,4,5]
b = [2,3,4,5]
c = [3,4,5]

zip(a,b) 
# 결과: <zip at 0x1115a7b00>

list(zip(a,b))
# 결과: [(1, 2), (2, 3), (3, 4), (4, 5)]

list(zip(a,b,c))
# 결과: [(1, 2, 3), (2, 3, 4), (3, 4, 5)]
  • 파이썬 3+에서는 zip() 함수가 제너레이터를 반환하므로, 결과를 바로 보려면 list()로 묶어야 한다.
  • zip() 함수는 리스트가 아닌 튜플로 시퀀스를 생성하므로, 값을 변경할 수 없는 불변 객체이다. 
d = list(zip(a,b,c))
d[0]  # (1,2,3)
d[0][0]  # 1
d[0][0] = 0
# TypeError: 'tuple' object does not support item assignment

 

 


아스테리스크 (*)

  • *는 파이썬에서 언패킹 연산자로, 시퀀스를 풀어헤치는 역할을 한다. 
from collections import Counter

num = [1,1,1,2,2,3]
k=2

counts = collections.Counter(num).most_common(k)
# 결과: [(1, 3), (2, 2)]

#언패킹했을 때 
list(zip(*counts))
# 결과: [(1, 2), (3, 2)]

# 언패킹하지 않았을 때
list(zip(counts))
# 결과: [((1, 3),), ((2, 2),)]
  • *counts는 [(1, 3), (2, 2)] 리스트 안의 각 튜플을 풀어 zip() 함수에 전달하여 (1, 2)와 (3, 2)가 만들어지게 한다. 

 

예제. *를 활용한 리스트 요소 출력

fruits = ['lemon', 'pear', 'waterlemon', 'tomato']

# 방법1
print(fruits[0], fruits[1], fruits[2], fruits[3])

# 방법2
for f in fruits:
    print(f, end=' ')
    
# 결과: lemon pear waterlemon tomato

# 방법3: 언패킹 활용
print(*fruits)
# 결과: lemon pear watermelon tomato
  • 리스트를 직접 하나하나 호출하지 않고, *로 언패킹하여 모든 요소를 출력할 수 있다. 
 

*를 사용한 함수 파라미터 패킹

  • *는 함수의 파라미터에서 여러 개의 인수를 하나의 튜플로 묶어준다.
  • 즉, 여러 값을 패킹하여 하나의 변수로 관리할 수 있게 한다.
def f(*params):
    print(params)
    
f('a','b','c')
# 결과: ('a', 'b', 'c')
  • 위 코드에서 f 함수는 *params라는 단일 변수로 여러 인수를 받는다.
  • 이 경우, params는 튜플로 패킹되어 ('a', 'b', 'c') 형태로 출력된다.

 

 


*를 활용한 리스트 언패킹

 
a, *b = [1,2,3,4]
a  # 1
b  # [2,3,4]
  • 여기서 a는 첫 번째 값 1을 받고, b는 나머지 [2, 3, 4]를 받게 된다. 이 방식은 리스트나 튜플의 첫 번째 값과 나머지 값을 나눌 때 유용하게 사용된다.
  • *를 사용하여 나머지 값들을 한 변수에 담을 수 있으므로, 파라미터를 효율적으로 다루거나 여러 변수로 값을 나누는 데에 아주 유용하다.

추가로 알아두면 좋은 *와 ** 활용

  • *는 리스트나 튜플을 언패킹
  • **는 딕셔너리의 키-값 쌍을 언패킹
date_info = {'year': '2020', 'month': '01', 'day': '7'}
new_info = {**date_info, 'day': "14"}
new_info
# 결과: {'year': '2020', 'month': '01', 'day': '14'}
  • 이처럼 **date_info는 기존 딕셔너리의 값을 언패킹하여 새로운 딕셔너리로 확장할 수 있다.

 

 

728x90
반응형

댓글