(Python) List Comprehension, Dict Comprehension 이해

2022. 12. 28. 23:54Trip to Python

오늘 진도를 나가던 중에 까먹은 내용이 있는데 바로 리스트 컴프리헨션이다. 컴프리헨션은 반복문을 보다 간략하게 쓸 수 있어서 매우 용이하다. 나도 처음 배울 때는 매우 직관적이고 이해가 되었는데 막상 조금 어려운 for 반복문을 변환하려니까 숨이 턱 막혔다. 아직 이해가 완전하지 못한 탓이다. 

 

예시를 통해서 다시 한 번 이해를 해보자

 

1.List Comprehension(숫자형)

 

1) For Loop 

numbers = [1, 2, 3]
new_list = []
for n in numbers:
	add_1 = n + 1
    new_list.append(add_1)

위와 같은 For Loop 문을 컴프리헨션 문으로 변환해보자

 

2) List Comprehension

numbers = [1, 2, 3]
new_list = [n+1 for n in numbers]

4줄을 1줄로 바꾸는 기적을 행하셨다. 

 

2. List Comprehension(문자형)

name = "kestrel"
name_list = [letter for letter in name]

문자열을 통과 시킬 경우 아래와 같이 한 글자씩 내보내서 리스트로 구성된다.

['k','e','s','t','r','e','l']

3. Dictionary Comprehension

names = ['Alex', 'Beth', 'Caroline', 'Dave', 'Eleanor', 'Freddie']
import random
student_scores = {name:score.radiant(1,100) for name in names}

리스트를 통해서 새로운 딕셔너리를 만들어줄 수도 있고 기존의 딕셔너리를 새로운 딕셔너리로 만들 수도 있다. 이 때는 item() 메소드를 활용해서 각 키와 값 쌍으로 접근하여 변경해준다.

 

4. 판다스 데이터 프레임에서 반복하는 방법

 

import pandas

student_dict = {
	"student": ["Angela", "James", "Lily"]
    "score": [56, 76, 98]
}

student_data_frame = pandas.DataFrame(student_dict)

저 딕셔너리를 보면 우리를 묘하게 불편하게 만든다. 이유는 이름에 해당하는 스코어를 연결짓고 싶어하는 우리의 묘한 욕망이 있기 때문이다. 

for (index, row) in student_data_frame.iterrows():
	print(row)

이렇게 하면 각 행마다 값을 볼 수 있다.

 

5. 간단한 활용

 

letter,code
A,Alfa
B,Bravo
.
.
.

우리에게 이런 csv 파일이 있고

 

#TODO 1. Create a dictionary in this format:
{"A": "Alfa", "B": "Bravo"}

이걸 바란다면 어떻게 해야할까?

import pandas
dict_from_csv = pandas.read_csv('nato_phonetic_alphabet.csv')
new_dict = {row.letter:row.code for (index, row) in dict_from_csv.iterrows()}

pandas 모듈을 통해서 가능하다. 먼저 pandas.read_csv를 통해서 파일을 열면 아까 데이터 프레임 형식으로 나온다. 여기서 각 열에 접근하게 해주는 iterrows() 함수를 사용하여 접근하고 각 인덱스와 로우가 나오고 그 값에 대해서 로우의 레터값과 로우의 코드 값을 뽑아내어 새로운 딕셔너리를 재구성하면 된다.

 

6. 간단한 활용 2

그럼 우리가 입력한 값에 대해서 코드 값을 산출하려면 어떻게 할까?

name = input("What is your name?")
letter_list = [letter for letter in name]

이렇게 하면 각 철자로 이루어진 리스트를 만들어 줄 수 있다. 다음으로는 철자들에 대응하는 코드값을 불러오면된다.

code_list = [new_dict[letter] for letter in letter_list]

레터 리스트에서 하나씩 꺼내고 그것을 키로 갖는 딕셔너리의 값을 불러내어 리스트로 구성하면된다.