리스트 컴프리헨션

JOOYEUN SEO·2024년 9월 7일

100 Days of Python

목록 보기
26/76
post-thumbnail

List/Dictionary Comprehensions

  • 파이썬의 독특한 특징 중 하나
  • 리스트나 딕셔너리를 사용하여 작업할 때, 코드를 많이 단축할 수 있는 기능
  • 이전 리스트/딕셔너리 등의 시퀀스로부터 새로운 리스트/딕셔너리를 만드는 경우 사용

❖ 리스트 컴프리헨션을 통한 리스트 생성

for문으로 리스트 컴프리헨션 기능을 구현

numbers = [1, 2, 3]
new_list = []

for n in numbers:
    add_1 = n + 1
    new_list.append(add_1)

print(new_list)
[2, 3, 4]

리스트 컴프리헨션 사용

  1. 새로운 리스트 이름 생성
  2. 새 리스트를 빈 리스트로 만들고 원소를 추가하는 대신, 바로 같은 줄에서 대괄호 열기
  3. 대괄호 안에 new_item for item in list 키워드 입력
    a. new_item : 기존 원소에서 새 원소를 얻기 위해 실행할 표현식 또는 코드
    b. item : 기존 리스트의 각 원소를 나타낼 이름
    c. list : 반복할 기존 리스트
numbers = [1, 2, 3]

new_list = [n + 1 for n in numbers]

print(new_list)
[2, 3, 4]

for문보다 훨씬 짧은 코드로 같은 기능 구현 가능

◇ 다양한 시퀀스에 적용하기

특정 순서를 가진 시퀀스(sequences)에 모두 적용 가능
(list, range, string, tuple...)

# 문자열에 적용
word = "computer"
letters_list = [letter for letter in word]
print(letters_list)

# 범위에 적용
range_list = [num * 2 for num in range(1, 5)]
print(range_list)
# 문자열에 적용
['c', 'o', 'm', 'p', 'u', 't', 'e', 'r']

# 범위에 적용
[2, 4, 6, 8]

◇ 조건부(conditional) 리스트 컴프리헨션

new_list = [ new_item for item in sequence if test ]

→ test를 통과했을 경우에만 new_item 수행

names = ["Alex", "Beth", "Caroline", "Dave", "Eleanor", "Freddie"]
short_names = [name.upper() for name in names if len(name) < 5]
print(short_names)
['ALEX', 'BETH', 'DAVE']

💯 coding exercises

Squaring Numbers
리스트 컴프리헨션으로 각 원소의 제곱수를 포함한 새 리스트 생성

numbers = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
# 🚨 Do Not Change the code above 👆

# Write your 1 line code 👇 below:
squared_numbers = [number ** 2 for number in numbers]
# Write your code 👆 above:

print(squared_numbers)
[1, 1, 4, 9, 25, 64, 169, 441, 1156, 3025]

💯 coding exercises

Filtering Even Numbers
리스트 컴프리헨션으로 각 원소의 자료형을 변경하고, 그 중 짝수만 포함한 새 리스트 생성

list_of_strings = input().split(',')
# 🚨 Do  not change the code above

# TODO: Use list comprehension to convert the strings to integers 👇:
numbers = [int(str) for str in list_of_strings]

# TODO: Use list comprehension to filter out the odd numbers
# and store the even numbers in a list called "result"
result = [num for num in numbers if num % 2 == 0]

# Write your code 👆 above:
print(result)
1, 1, 2, 3, 5, 8, 13, 21, 34, 55
[2, 8, 34]

💯 coding exercises

Data Overlap
리스트 컴프리헨션으로 file1과 file2에 공통으로 포함된 숫자를 포함한 새 리스트 생성

  • 출력 결과는 문자열이 아닌 정수형이어야 한다
  • 힌트
    • readlines() 메소드
    • in 키워드

📄 file1.txt

3
6
5
8
33
12
7
4
72
2
42
13

📄 file2.txt

3
6
13
5
7
89
12
3
33
34
1

⌨️ main.py

with open("file1.txt") as file1:
  list1 = file1.readlines()
    
with open("file2.txt") as file2:
  list2 = file2.readlines()
    
result = [int(num) for num in list1 if num in list2]

# Your code above 👆
print(result)
[3, 6, 5, 33, 12, 7, 42, 13]

🗂️ 미국 주 게임에 리스트 컴프리헨션 사용

day16 프로젝트 : 미국 주 게임

이전 버전의 코드를 리스트 컴프리헨션으로 간략하게 수정

🔍 유의 사항

  • 이전 버전 : exit를 입력 시 CSV파일에 저장할 빈 리스트 missing_states 생성 후 원소 추가
    수정 버전 : 해당 부분을 리스트 컴프리헨션으로 간략하게 줄이기

⌨️ main.py

import turtle
import pandas

screen = turtle.Screen()
screen.title("U.S. States Game")
image = "blank_states_img.gif"
screen.addshape(image)
turtle.shape(image)

screen.tracer(0)

data = pandas.read_csv("50_states.csv")
all_states = data.state.to_list()
guessed_states = []

while len(guessed_states) < 50:
    screen.update()

    answer_state = screen.textinput(title=f"{len(guessed_states)}/50 States Correct",
                                    prompt="What's another state's name?").title()
    if answer_state == "Exit":
        # 수정 버전
        missing_states = [state for state in all_states if state not in guessed_states]
        
        new_data = pandas.DataFrame(missing_states)
        new_data.to_csv("states_to_learn.csv")
        break

    if answer_state in all_states:
        guessed_states.append(answer_state)
        pin = turtle.Turtle()
        pin.hideturtle()
        pin.penup()
        state_data = data[data.state == answer_state]
        pin.goto(int(state_data.x), int(state_data.y))
        pin.write(answer_state)

❖ 딕셔너리 컴프리헨션 사용 방법

  • ① 가장 단순한 형태의 딕셔너리 컴프리헨션
    new_dict = { new_key:new_value for item in sequence }
  • dictionary.items() : 딕셔너리의 키-값 쌍을 반환하는 메소드
    • ② 이미 존재하는 딕셔너리의 값으로 새로운 딕셔너리 생성
      new_dict = { new_key:new_value for (key, value) in dict.items() }
    • ③ 조건부 딕셔너리 컴프리헨션
      new_dict = { new_key:new_value for (key, value) in dict.items() if test }
import random

names = ["Alex", "Beth", "Caroline", "Dave", "Eleanor", "Freddie"]

# 각 학생에게 1에서 100 사이의 점수 중 하나를 랜덤으로 부여한 딕셔너리 생성
students_scores = {student:random.randint(1, 100) for student in names}
print(students_scores)

# 60점 이상인 학생만 포함한 딕셔너리 생성
passed_students = {student:grade for (student,grade) in students_scores.items() if grade>60}
print(passed_students)
#
{'Alex': 56, 'Beth': 68, 'Caroline': 73, 'Dave': 11, 'Eleanor': 16, 'Freddie': 97}

#
{'Beth': 68, 'Caroline': 73, 'Freddie': 97}

💯 coding exercises

Dictionary Comprehension 1
딕셔너리 컴프리헨션으로 문장의 각 단어를 취하여 글자 수를 계산하는 새 딕셔너리 생성

  • 힌트
    • split()
    • 'Swallow?' 의 물음표도 단어로 계산 (즉, 해당 문자열의 길이는 8)
sentence = "What is the Airspeed Velocity of an Unladen Swallow?"
# 🚨 Don't change code above 👆
# Write your code below 👇
result = {word:len(word) for word in sentence.split()}

print(result)
{'What': 4, 'is': 2, 'the': 3, 'Airspeed': 8, 'Velocity': 8, 'of': 2, 'an': 2, 'Unladen': 7, 'Swallow?': 8}

💯 coding exercises

ictionary Comprehension 2
섭씨 온도(temp_c)를 화씨 온도(temp_f)로 변환하는 새 딕셔너리 생성

  • 변환 공식 : (temp_c * 9/5) + 32 = temp_f
weather_c = {
    "Monday": 12, "Tuesday": 14, "Wednesday": 15,
    "Thursday": 14, "Friday": 21, "Saturday": 22, "Sunday": 24
}
# 🚨 Don't change code above 👆
# Write your code 👇 below:
weather_f = {day:(temp * 9/5) + 32 for (day, temp) in weather_c.items()}

print(weather_f)
{'Monday': 53.6, 'Tuesday': 57.2, 'Wednesday': 59.0, 'Thursday': 57.2, 'Friday': 69.8, 'Saturday': 71.6, 'Sunday': 75.2}

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

  • dataframe.iterrows()
    • ④ 각 열 대신 데이터프레임에 있는 각 행을 반복 실행하는 메소드
    • new_dict = { new_key:new_value for (index, row) in dataframe.iterrows() }
import pandas

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

student_data_frame = pandas.DataFrame(student_dict)

# 1-1. for문으로 딕셔너리 키 반복 출력
for (key, value) in student_dict.items():
    print(key)

# 1-2. for문으로 딕셔너리 값 반복 출력
for (key, value) in student_dict.items():
    print(value)

# 2-1. 데이터 프레임의 iterrows 메소드로 인덱스 값 반복 출력
for (index, row) in student_data_frame.iterrows():
    print(index)

# 2-2. 데이터 프레임의 iterrows 메소드로 행 반복 출력
for (index, row) in student_data_frame.iterrows():
    print(row)

# 2-2-1. 데이터 프레임의 iterrows 메소드로 행의 특정 열 반복 출력
for (index, row) in student_data_frame.iterrows():
    print(row.student)
    
# 2-2-2. 데이터 프레임의 iterrows 메소드로 조건을 만족하는 행의 특정 열 반복 출력
for (index, row) in student_data_frame.iterrows():
    if row.score > 60:
        print(row.student)
[ 출력 결과 ]

# 1-1.
student
score


# 1-2.
['Angela', 'James', 'Lily']
[56, 76, 98]


# 2-1.
0
1
2


# 2-2.
student    Angela
score          56
Name: 0, dtype: object
student    James
score         76
Name: 1, dtype: object
student    Lily
score        98
Name: 2, dtype: object


# 2-2-1.
Angela
James
Lily


# 2-2-2.
James
Lily

🗂️ Day26 프로젝트 : NATO 알파벳 음성기호

단어를 입력하면 각 알파벳과 일치하는 나토 알파벳 음성기호의 목록을 반환하는 프로그램

📄 nato_phonetic_alphabet.csv

letter,code
A,Alfa
B,Bravo
C,Charlie
D,Delta
E,Echo
F,Foxtrot
G,Golf
H,Hotel
I,India
J,Juliet
K,Kilo
L,Lima
M,Mike
N,November
O,Oscar
P,Papa
Q,Quebec
R,Romeo
S,Sierra
T,Tango
U,Uniform
V,Victor
W,Whiskey
X,X-ray
Y,Yankee
Z,Zulu

⌨️ main.py

import pandas

data = pandas.read_csv("nato_phonetic_alphabet.csv")

# 1. 딕셔너리 생성
phonetic_dict = {row.letter:row.code for (index, row) in data.iterrows()}

# 2. 사용자가 입력한 단어 각각의 문자에 대한 음성규약 단어 리스트 생성
user_word = input("Enter a word : ").upper()
output_list = [phonetic_dict[letter] for letter in user_word]

print(output_list)
Enter a word : ❚tom
['Tango', 'Oscar', 'Mike']




▷ Angela Yu, [Python 부트캠프 : 100개의 프로젝트로 Python 개발 완전 정복], Udemy, https://www.udemy.com/course/best-100-days-python/?couponCode=ST3MT72524

0개의 댓글