이번에 다루는 내용은 파이썬이 제공하는 특별한 기능이다. 파이썬이 특별히 제공하는 기능을 사용하지 않더라도 프로그램을 작성하는 큰 어려움은 없으나 이 기능들을 사용하면 보다 쉽게 그리고 '파이썬 스럽게' 코드를 작성할 수 있다.
리스트에 적용할 수 있는 기본 함수 : min(), max(), sum()
lst = [1, 2, 3, 100, -12, 55]
print( max(lst) )
print( min(lst) )
print( sum(lst) )
100 -12 149
reversed() 함수로 리스트 뒤집기
lst = [0, 1, 2, 3, 4]
print( lst )
print( list( reversed(lst) ) )
[0, 1, 2, 3, 4] [4, 3, 2, 1, 0]
lst = [0, 1, 2, 3, 4]
print(type(reversed(lst)))
<class 'list_reverseiterator'>
for idx in reversed(lst):
print(idx)
4
3
2
1
0
enumerate() 함수와 반복문 조합하기
다음과 같은 리스트가 있다.
lst = ['성분A', '성분B', '성분C']
리스트 lst의 각 요소를 아래와 같이 출력하는 코드를 쉽게 작성하실 수 있다
0번째 요소는 성분A입니다.
1번째 요소는 성분B입니다.
2번째 요소는 성분C입니다.
위와 같은 출력 결과를 얻기 위한 코드는 다양할 것이다.
조금 다른 측면에서 말씀드리면 반복 작업을 수행하면서 현재 몇 번째 작업인지 알 수 있는 방법에 대해 생각해 보자.
# 방법 1
lst = ['성분A', '성분B', '성분C']
for idx in range(len(lst)):
print('{}번째 요소는 {}입니다.'.format(idx, lst[idx]))
0번째 요소는 성분A입니다. 1번째 요소는 성분B입니다. 2번째 요소는 성분C입니다.
# 방법 2
lst = ['성분A', '성분B', '성분C']
idx = 0
for element in lst:
print('{}번째 요소는 {}입니다.'.format(idx, element))
idx += 1
0번째 요소는 성분A입니다. 1번째 요소는 성분B입니다. 2번째 요소는 성분C입니다.
리스트에 대해 각 요소를 가지고 반복적인 작업을 수행하는 경우 현재 처리하고 있는 요소가 몇 번째인지 즉 요소의 인덱스를 알수 있도록 enumerate() 함수를 제공.
lst = ['성분A', '성분B', '성분C']
print( enumerate(lst) )
<enumerate object at 0x7f0740190380>
lst = ['성분A', '성분B', '성분C']
print( list( enumerate(lst) ) )
[(0, '성분A'), (1, '성분B'), (2, '성분C')]
for idx, element in enumerate(lst):
print('{}번째 요소는 {}입니다.'.format(idx, element))
0번째 요소는 성분A입니다. 1번째 요소는 성분B입니다. 2번째 요소는 성분C입니다.
리스트 형 데이터는 대괄호([ ])로 표현되고 딕셔너리 형 데이터는 중괄호({ })로 표현되었다. 그런데 아래 코드에서 (0, '성분A')은 어떤 데이터 형(태)일까? 파이썬에는 튜플(tuple)이라는 데이터 형을 소괄호(())로 표현한다.
◃참고▹
lst = ['성분A', '성분B', '성분C']
print( list( zip(range(len(lst)), lst) ) )
[(0, '성분A'), (1, '성분B'), (2, '성분C')]
딕셔너리의 item() 함수와 반복문 조합하기
enumerate()함수와 반복문을 함께 사용해서 for i, value in enumarate(리스트):형태로 반복문을 활용했던 것처럼 딕셔너리는 items() 함수를 사용하여 키(key)와 값(value)을 동시에 접근하면서 반복문을 구현할 수 있다.
dic ={
'nick_name':'ship',
'height': 176.5,
'weight': 75,
'blood_type': 'B',
'address':'경기도 화성시'
}
print( dic )
print( dic.items() )
print( type(dic.items()) ) # <class 'dict_items'> Python에서는 다양한 데이터 형(태)가 있음.
{'nick_name': 'ship', 'height': 176.5, 'weight': 75, 'blood_type': 'B', 'address': '경기도 화성시'} dict_items([('nick_name', 'ship'), ('height', 176.5), ('weight', 75), ('blood_type', 'B'), ('address', '경기도 화성시')]) <class 'dict_items'>
item() = 딕셔너리 키와 값들을 리스트로 받아 튜플로 데이터를 만들어줌
리스트 내포
데이터를 리스트 형태로 처리하는 경우가 많다. 필요에 따라 다양한 요소를 갖는 리스트를 만들게 되는데 예를 들어 0부터 10사이에 있는 정수의 제곱 값을 요소로 하는 리스트가 필요하다고 가정하겠다. 어떻게 코드를 짜야할까?
target_list =[]
for element in range(0, 10, 2):
target_list.append( element ** 2 )
print(target_list)
[0, 4, 16, 36, 64]
[ each_v **2 for each_v in [0, 2, 4, 6, 8] ]
[0, 4, 16, 36, 64]
위 코드 다시 말하면 "리스트, [0, 2, 4, 6, 8]의 각 요소를 제곱하여 얻은 값이 요소가 되는 리스트를 만들어"가 되겠다.
앞서, 0부터 10사이에 있는 정수의 제곱 값을 요소로 하는 리스트가 필요하다고 가정했었는데. 아래 코드와 같이 구현할 수 있다. 이런 형태의 코드를 **리스트 내포(list comprehensions)**라고 한다.
target_list = [element**2 for element in range(0, 10, 2)]
print(target_list)
[0, 4, 16, 36, 64]
"4는 빼고!”
target_list = [element**2 for element in range(0, 10, 2) if element != 4]
print(target_list)
[0, 4, 36, 64]
"6도 빼!”
target_list = [ element**2 for element in range(0, 10, 2) if element not in [4,6] ]
print(target_list)
[0, 4, 64]
data = [1, 2, 3, 4, 5]
[ '짝수' if i % 2 == 0 else '홀수' for i in data ]
['홀수', '짝수', '홀수', '짝수', '홀수']
Quiz
아래 보인 lst와 같은 리스트를 생성하기 위한 코드를 작성하는데, 리스트 내포를 이용해서 작성하시오.
lst = [ (0,0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), ... (2, 3)]
lst = [(row, col) for row in rows for col in cols]
print(lst)
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3)]
- if 조건문과 여러 줄 문자열(1) - 문자열의 join() 함수
문자열의 join() 함수로 해결하는 경우도 있다. join() 함수는 다음과 같은 형태로 사용.
문자열.join(문자열로_구성된_리스트)
join() 함수는 리트의 요소를 문자열로 연결.
'-'.join(['2023','12', '09' ])
2023-12-09
':'.join(['11', '45', '21'])
11:45:21
- 좀 더 알아보기(2) - 이터레이터
for 반복자in 반복할_수_있는_것:
#statement(문장)
위 코드에서 반복할_수_있는_것을 프로그래밍 용어로 **이터러블(iterable)**이라고 한다. 즉 이터러블은 내부에 있는 요소를 하나씩 꺼낼 수 있는 객체를 의미한다. 리스트, 딕셔너리, 문자열, 튜플 등은 모두 내부에서 요소를 하나씩 꺼낼 수 있으므로 이터러블이다.
for 반복자in 이터러블:
# statement(문장)
이터러블(예, 리슽, 딕셔너리, 문자열, 튜플 등등) 중에서 next()함수를 적용해서 하나씩 꺼낼 수 있는 요소를 이터레이터(iterator)라고 한다. 이터레이터의 예를 살펴 보겠다.
numbers = [1, 2, 3, 4, 5, 6]
r_num = reversed(numbers)
print("r_num returned from reversed() : ", r_num)
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))
print(next(r_num))
r_num returned from reversed() : <list_reverseiterator object at 0x7f1bc7be1d60> 6 5 4 3 2 1
reversed() 함수의 리턴값이 바로 'reverseiterator'로 이터레이터입니다. next(이터레이터)형식으로 next()함수를 호출하면 이터레이터 내부에 있는 요소 하나를 반환 후 해당 요소는 이터레이터에서 삭제됩니다.
◃참고▹ 이터러블(iterable)과 이터레이터(iterator)
이터러블(iterable)란 내부에 있는 요소를 하나씩 꺼낼 수 있는 객체를 말합니다. 예들어 리스트, 딕셔너리 등이 있습니다. 이터레이터는 이터러블한 성질을 가지면서 이터레이터를 'next()' 함수에 매개변수로 전달해 호출할 때 마다 각 요소의 값을 반환해 줍니다. 모든 이터러블한 객체가 다 이터레이터가 되는 것은 아닙니다. 다시 예를 들어, 리스트는 이터러블한 객체입니다. 그러나 이터레이터는 아닙니다.
lst = [1, 2, 3, 4, 5]
next(lst)
TypeError Traceback (most recent call last) <ipython-input-15-eed0cf47551a> in <module> 1 lst = [1, 2, 3, 4, 5] ----> 2 next(lst)
TypeError: 'list' object is not an iterator
TypeError: 'list' object is not aniterator이라는 에러 메시지가 출력되었습니다. 리스트 (객체)는 이터레이터가 아니라고 하는군요. 리스트 형 테이터를 꼭 이터레이터로 만들어야겠다면 iter()함수를 사용할 수 있습니다.
lst = [1, 2, 3, 4, 5]
i_lst = iter(lst)
next(i_lst)
1
numbers = [1,2,3,4,5,6]
r_numbers = reversed(numbers)
for i in range(len(numbers)):
print(next(r_numbers))
print(list(r_numbers))
print('end')
6 5 4 3 2 1 [] end
이터레이터는 읽어가면(list(r_numbers)) 내용물이 사라진다.
numbers = [1,2,3,4,5,6]
r_numbers = reversed(numbers)
print(list(r_numbers))
for num in r_numbers:
print(num)
print(list(r_numbers))
print('end')
[6, 5, 4, 3, 2, 1] end
numbers = [1,2,3,4,5,6]
r_numbers = reversed(numbers)
for i in range(3):
print(next(r_numbers))
print('--------------------------')
for i in range(3):
print(next(r_numbers))
print('end')
6 5 4
3 2 1 end
numbers = [1,2,3,4,5,6]
r_numbers = reversed(numbers)
for i in range(3):
print(next(r_numbers))
print('--------------------------')
print(list(r_numbers))
print('--------------------------')
for i in range(3):
print(next(r_numbers))
print('end')
6 5 4
[3, 2, 1]
StopIteration Traceback (most recent call last) <ipython-input-27-7a42e88853ff> in <cell line: 10>() 9 10 for i in range(3): ---> 11 print(next(r_numbers)) 12 13 print('end')
StopIteration:
리스트 안에 딕셔너리 값만 출력 : isinstance()
adic = {
'name':'kim',
'age' : 27
}
bdic = {
'name':'sung',
'age':22
}
message = [
[1,2,3,adic,'a','kim'],
['phil',1,5,7,4,4,4,2, adic, bdic],
[bdic, (3,2), 3.14, {'goal':90, 'target':95}]
]
for element in message:
for el in element:
if isinstance(el, dict):
for key in el.keys():
print(key,':', el[key])
name : kim
age : 27
name : kim
age : 27
name : sung
age : 22
name : sung
age : 22
goal : 90
target : 95
'빅데이터 분석가 양성과정 > Python' 카테고리의 다른 글
Ch05-2 함수 / 함수의 활용 (0) | 2024.07.05 |
---|---|
Ch05-1 함수 / 함수 만들기 (0) | 2024.07.05 |
CH04-3 반복문 / 범위 자료형과 while 반복문 (0) | 2024.07.05 |
Ch04-2 반복문 / 딕셔너리와 반복문 (0) | 2024.07.04 |
Ch04-1 반복문 / 리스트와 반복문 (0) | 2024.07.04 |