안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.
업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.
제가 지금까지 다루었던 프로젝트들은 리스트만으로 충분했으나, 최근 진행한 프로젝트에서는 리스트들끼리 짝을 맞추어서 저장하고, 꺼내어 사용해야 하는 경우가 생기니깐 어떻게 해야할지 잘 모르겠더라구요.
그래서 오늘은 길이가 같은 리스트들의 요소들을 차례대로 조합해서 새로운 리스트, 딕셔너리로 만드는 방법에 대해서 알아보고, 그것을 어떻게 다시 참조할 수 있는지 함께 알아보겠습니다.
1. 리스트 2개를 요소들끼리 묶어주는 법
보통 코드를 짜다보면, 요소들을 받아와서 리스트에 차곡차곡 쌓는 경우가 많습니다.
그런데 이 리스트들을 요소들끼리 순서대로 묶어주고 싶을 때가 있습니다.
[사과, 1000원], [딸기, 2000원], ... 이런 식으로 말이죠.
이럴 때는 파이썬 내장 라이브러리에 포함되어 있는 zip 함수를 사용합니다.
사용법은 간단합니다. 리스트명을 zip( ) 안에 순서대로 넣어주면 됩니다.
여기서 꼭 알아두실 점은 zip( )만 사용하면 그냥 리스트의 내용물이 분배된 상태로 zip object 로 저장된다는 것입니다.
product_names = ['사과','딸기','배','포도','키위']
product_prices = ['1000원','2000원','3000원','4000원','5000원']
zip_obj = zip(product_names, product_prices)
실제로 zip_obj를 print 함수로 출력해보면 <zip object at 0x0000019014B3A3C0>와 같은 형태로 출력됩니다.
우리는 이 zip_obj를 리스트로 만들어 줄 수도 있고, 딕셔너리로도 만들어 줄 수 있습니다.
(리스트로 만들 시, 각 요소들이 튜플로 묶여있음)
list(zip_obj)
>>> [('사과', '1000원'), ('딸기', '2000원'), ('배', '3000원'), ('포도', '4000원'), ('키위', '5000원')]
dict(zip_obj)
>>> {'사과': '1000원', '딸기': '2000원', '배': '3000원', '포도': '4000원', '키위': '5000원'}
<여기서 잠깐>
저도 글을 작성하면서 알게된 점은, zip_obj를 한 번 사용하면 해당 주소에 들어있는 값이 사라진다는 것입니다.
그래서 위와 같이 zip_obj로 만들고, list나 dict로 만들어주는 것보다는 아래와 같이 한번에 코딩해주는 것이 좋겠습니다.
list_zip = list(zip(product_names, product_prices))
dict_zip = dict(zip(product_names, product_prices))
2. 리스트 3개 이상을 요소들끼리 묶어주는 법
이번엔 리스트 3개 이상을 묶어주는 방법을 알아보겠습니다. 똑같이 적용하면 되지 뭐가 문제냐고 생각하실 수 있는데요.
리스트 형태로 만들어주는 것은 전혀 문제가 없지만, 딕셔너리 형태로 만들어 줄 때는 문제가 생깁니다.
왜냐하면 딕셔너리는 Key: Value와 같이 단 2개씩만 묶어줄 수 있기 때문입니다.
딕셔너리 기본 형태 = {Key1:Value1, Key2:Value2, ...}
dic = {'name':'손생', 'age':'31'}
그러면 어떻게 해줘야할까요?
정답은 리스트 하나를 Key로 사용하고, 나머지 리스트들을 묶어서 Value로 사용하는 것입니다.
Key는 중복을 허용하지 않으므로, 중복되지 않을만한 제품 링크 주소를 Key로 사용해줍시다.
이런 식으로 묶어주시면 됩니다.
product_links = ['링크1','링크2','링크3','링크4','링크 5']
product_prices = ['1000원','2000원','3000원','4000원','5000원']
product_names = ['사과','딸기','배','포도','키위']
dict_product = dict(zip(product_links, zip(product_prices, product_names)))
<dict_product 출력 결과>
{'링크1': ('1000원', '사과'),
'링크2': ('2000원', '딸기'),
'링크3': ('3000원', '배'),
'링크4': ('4000원', '포도'),
'링크 5': ('5000원', '키위')}
3. 만들어진 딕셔너리 사용 방법
위에서 리스트를 이용해서 딕셔너리를 만드는 방법을 알아보았다면, 이제는 만든 딕셔너리를 사용하는 방법을 배워야겠죠?
이 부분은 딕셔너리 기초를 안다면 쉽게 이해할 수 있는 부분이므로 그냥 넘어가겠습니다.
# 제품 링크
key
# 제품 이름
dict_product[key][0]
# 제품 가격
dict_product[key][1]
4. 딕셔너리 응용 방법
아래의 코드는 특정 스마트스토어에서 새로 업로드 되는 제품만 텔레그램으로 전송받고자 했을 때 사용했던 코드입니다.
key에 저장된 제품 링크를 비교해서 새제품의 key : value만 필터링하여 저장 및 사용하기 위해서 딕셔너리를 사용하였죠. (글을 작성하면서 굳이 딕셔너리가 아니어도 zip 함수로 리스트를 만들고 인덱싱을 잘해주면 되겠다는걸 깨달았지만 그냥 넘어가도록 하겠습니다ㅎㅎ..)
위에서 만들었던 dict_product를 아래와 같이 딕셔너리 컴프리헨션과 결합하여 사용할 수 있답니다. 딕셔너리 컴프리헨션은 리스트 컴프리헨션을 알고계시다면 아주 쉽게 이해하실 수 있습니다.
new_products = {key:value for key, value in dict_product.items() if key not in old_products}
여기서 new_products에 저장된 값들은 for문을 이용해서 아래와 같이 가져올 수 있습니다.
<실제 응용 코드>
# 새로운 메시지가 있으면 링크 전송
if new_products:
for key in new_products:
bot.sendMessage(chat_id=chat_id,
text= new_products[key][0] +
'\n\n' + '가격:' + new_products[key][1] + '원' +
'\n\n' + key)
'파이썬 기초 > 중급 문법' 카테고리의 다른 글
[파이썬 중급 문법] for 문 안에서 리스트 내포를 사용할 때 주의할 점 (3) | 2022.01.12 |
---|---|
[파이썬 중급 문법] 리스트 컴프리헨션 간단 정리 (7) | 2021.11.21 |
[파이썬 중급 문법] 클래스(class) 총정리 2편_ 초기화, 상속, 메소드 오버라이딩, 클래스 변수, 인스턴스 변수 (6) | 2021.05.03 |
[파이썬 중급 문법] 클래스(class) 총정리 1편_객체,속성,메소드,인스턴스 (6) | 2021.05.02 |