데이터 분석/python

[Python] zip() 함수, 사용 예제

참치바나나 2020. 12. 10. 13:05

zip() 함수는 iterable(이터러블 : 반복 가능한 것들)을 여러개 받고, 원소 1개씩을 뽑아 tuple(튜플)로 합친다.

> 주로 여러 개의 리스트 동시에 for 문에 넣어 새로운 리스트를 만들고 싶을 때 사용한다.

 

syntax(문법)

zip(*iterables)

* : 여러개의 인수(argument)를 받을 때 앞에 붙임, asterisk(애스터리스크)라고 부름

 

예제 1

두 개 리스트 이름(last_name)과 성(first_name)을 합치고 출력해 본다

last_names = ["Jack","Matt","Obama"]
first_names = ["Cock", "Bal", "Care"]

result = zip(last_names,first_names)

print (result)

zip 오브젝트라고 나온다

<zip object at 0x7facb7320800>

 

> zip() 함수는 <zip 오브젝트(객체 : 덩어리)>를 만들어 낸다. 이것도 당연히 iterable 이다. 따라서 반복문에 그냥 넣을 수 있다.

 

예제 2

zip() 오브젝트를 출력하여 값을 보고 싶을 때는 list나 dictionary로 변환해야 한다.

last_names = ["Jack","Matt","Obama"]
middle_names = ["D","S","O"]
first_names = ["Cock", "Bal", "Care"]

result_list = list(zip(last_names,middle_names,first_names))
result_dict = dict(zip(last_names,first_names))

print (result_list)
print (result_dict)

 

  • list로 바꾸면 각 원소가 tuple로 나온다. 여러 개를 합친 zip 오브젝트를 바꿀 수 있다.
  • dictionary를 만드는 건 2개를 합친 zip 오브젝트만 가능하다.
[('Jack', 'D', 'Cock'), ('Matt', 'S', 'Bal'), ('Obama', 'O', 'Care')]
{'Jack': 'Cock', 'Matt': 'Bal', 'Obama': 'Care'}

 

 

예제 3

이름, 성, 중간 이름의 세 개 list를 각각 합쳐서 한 개(full_name)으로 만들기

zip() 오브젝트를 list comprehesion으로 for 문을 돌려 string(문자열)을 만든다.

     *list comprehension : 리스트를 만들기 위해 한 줄로 for 문을 돌릴 수 있게 하는 문법  =>  [ <code> for i in iterable ]

full_names = [ ' '.join(i) for i in zip(last_names,middle_names,first_names)]
print (full_names)

 

출력

['Jack D Cock', 'Matt S Bal', 'Obama O Care']

 

 

예제 4

각각의 이름 마다 index 값을 넣어 [index , fullname]으로 된 새로운 list 만들기

     *enumerate : iterable의 index를 사용할 수 있게 해줌

[ [i,' '.join(j)] for i,j in enumerate(zip(last_names,middle_names,first_names))]

출력

[[0, 'Jack D Cock'], [1, 'Matt S Bal'], [2, 'Obama O Care']]

 

 

예제 5

사용자 정보 리스트 만들기

1. 이름은 full name으로 만들어 주세요

2. 여러 개의 attribute(속성)가 있을 수 있습니다 : email, address, phone number 등

3. 출력은 1개의 리스트로 보여주세요

last_names = ["Jack","Matt","Obama"]
middle_names = ["D","S","O"]
first_names = ["Cock", "Bal", "Care"]
emails = ['jackcock@gmail.com','BalMatt@gmail.com','ObamaCare@gmail.com']
address = ['dongsack-dong','imnae-dong','jangsajin-dong']

## fullname으로 만드는 함수
def mk_fullname():
	<code>
    
## user info를 정리한 함수
def user_info():
	<code>

     

  • *args(아규먼트, 다른 이름으로 해도 됨) 는 여러개를 원소의 반복으로 받음. 여러개 취급
  • *args = a, b, c, d 
  • zip(*args) = last_names, middle_names, first_names
  •  
  • 반면에 args 는 튜플. 한 개 취급
  • args = (a, b, c, d)
  • zip(args) = (last_names, middle_names, first_names)

 

만들기

def mk_fullname(*args):
    full_names = [ ' '.join(name) for name in zip(*args)]
    return full_names

def user_info(*args):
    result = [ [idx,*datas] for idx,datas in enumerate(zip(*args))]
    return result

fullnames = mk_fullname(last_names,middle_names,first_names)
user_info(fullnames,emails,address)

 

출력

[[0, 'Jack D Cock', 'jackcock@gmail.com', 'dongsack-dong'],
 [1, 'Matt S Bal', 'BalMatt@gmail.com', 'imnae-dong'],
 [2, 'Obama O Care', 'ObamaCare@gmail.com', 'jangsajin-dong']]

 

 


 

https://unsplash.com/@byrdman85