본문 바로가기
국비 교육/파이썬

[파이썬] Comprehension, zip(), enumerate()

by 육츠 2023. 11. 5.
Contents 접기

Comprehension

하나 이상의 iterator로부터 파이썬의 자료구조를 만드는 방법

1) List Comprehension

append() 이용 / range() 이용
[ 표현식 for 항목 in 순회 가능한 객체 ]
[ 표현식 for 항목 in 순회 가능한 객체 if 조건 ]

2) Dictionary Comprehension

List Comprehension 와 같이 if, for .. 다중 절을 가질 수 있다.
{ 키 표현식 : 값 표현식 for 항목 in 순회 가능한 객체 }

3) Set Comprehension

{ 표현식 for 항목 in 순회 가능한 객체  }

tmp = {1,3,5,6,8,44,6,88,3,34}
a = [i for i in tmp if not i%2] # 짝수이면
print(a)
# [34, 6, 8, 44, 88]

# 같은 형식
# dob_list = [[0,0,0,0,0,0,0], 
#             [0,0,0,0,0,0,0],
#             [0,0,0,0,0,0,0],
#             [0,0,0,0,0,0,0]]

dob_list = [[ 0 for col in range(7) ]for row in range(4)]
print(dob_list)
# [[0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0]]

# 전 노래 가사 활용 코드
mydic= { word:word_list.count(word) for word in word_list }
print(mydic)
{'hello,': 3, "it's": 3, ...}

 

[ 문제 ] 1~ 100까지 1씩 증가하는 데이터를 발생하여 3의 배수이거나 5의 배수인 데이터만 리스트에 포함하세요

l = list(x for x in range(1,101) if (x%3==0) or (x%5 == 0))
print(l)

# 교수님코드
t = [i for i in range(1,101) if not i%3 or not i%5 ]
print(t)

# [3, 5, 6, 9, 10, 12, ...]

 

zip()

여러 시퀀스를 병렬로 순회하는 함수. 여러 시퀀스 중 가장 짧은 시퀀스가 완료되면 멈춘다.
두 개 이상의 리스트, 튜플의 값을 병렬적으로 추출할때 사용한다.

data1 =[1,2,3,4,5]
data2 = [10,20,30,40,50]
data3 = [100,200,300,400]

result1 = [x for x in zip(data1,data2)]
print(result1)
result2 = [ sum(x) for x in zip(data1, data2, data3)]
print(result2)
# [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50)]
# [111, 222, 333, 444]

yoil = ["월","화","수","목","금","토","일"]
food = ["갈비탕","순대국","칼국수","삼겹살"]
menu = zip(yoil,food)

for y , f in menu:
    print("%s요일 메뉴 %s " %(y,f))
# 월요일 메뉴 갈비탕 
# 화요일 메뉴 순대국 
# 수요일 메뉴 칼국수 
# 목요일 메뉴 삼겹살    

d = dict(zip(yoil,food))
print(d)
# {'월': '갈비탕', '화': '순대국', '수': '칼국수', '목': '삼겹살'}

 

enumerate()

순서값과 요소값 둘을 한 번에 구해주는 내장함수
리스트의 순서값과 요소값을 튜플{}로 묶은 컬렉션을 리턴한다.

yoil = ["월","화","수","목","금","토","일"]
# eenumerate 의 두 번째 인수로 시작값을 지정

for i,item in enumerate(yoil,1):
    print(i,item)
# 1 월
# 2 화
...

# 실제 데이터 -> 
color = ["빨강", "주황","노랑","초록","파랑"]
# 바뀌어야 할 key = 색명
map_data = { v:i for i,v in enumerate(color)}
print(map_data)
# {'빨강': 0, '주황': 1, '노랑': 2, '초록': 3, '파랑': 4}

 

[문제] 리스트 x와 y를 이용하여 리스트 z와 같은 결과가 나오도록 하세요.

x = [[1,2,3],[4,5,6]] , y = [[11,12,13],[14,15,16]]
z = [[12,14,16][18,20,22]]

hint : list comprehension(), zip() 활용 서로 상응 하는 숫자끼리 더하는 것

x = [[1,2,3],[4,5,6]]
y = [[11,12,13],[14,15,16]]

# print(list(zip(x,y))) 확인용
#z = [[sum(i) for i in zip(x[0],y[0])]for j in zip(x[1],y[1])] 
# : 내가 한거 > 틀린 문장 : 아직 comprehension이 익숙하지 않아 힘들었다.

z = [ [sum(c) for c in zip(a,b) ] for a,b  in zip(x,y)]
# 오른쪽 for문 : [([1, 2, 3], [11, 12, 13]), ([4, 5, 6], [14, 15, 16])]
# c--> [(1,11),(2,12),(3,13),...]
print(z)

 

'국비 교육 > 파이썬' 카테고리의 다른 글

[파이썬] 함수 - 2  (0) 2023.11.05
[파이썬] 함수 -1  (0) 2023.11.05
[파이썬] 딕셔너리 Dictionary , 튜플 Tuple, 집합 Set  (0) 2023.11.05
[파이썬] List  (0) 2023.11.04