소연의_개발일지
article thumbnail

리스트 컴프리헨션(List Comprehension)

리스트 컴프리헨션(list comprehension)은 파이썬에서만 존재하는 기능으로, 입력한 양은 줄어들고 코드는 줄일 수 있고 쉽게 읽을 수 있다. 이전까지는 for loop를 만들어서 빈 리스트에 1씩 증가하는 식을 넣어 1씩 증가한 리스트를 만들었지만, 리스트 컴프리헨션을 쓰면 1줄로 만들 수 있다는 장점이 있다.

 

리스트 컴프리헨션 - 리스트(list) 활용

리스트 컴프리헨션의 방법은 아래와 같다.

new_list = [new_item for item in list]

기존의 for loop를 사용한 방식

# 기존방식
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]

리스트 컴프리헨션을 사용한 방식

# 리스트 컴프리헨션
numbers = [1, 2, 3]
new_list = [n+1 for n in numbers]
print(new_list) #[2, 3, 4]

2씩 곱한값을 반환받는 식

new_number_list = [i*2 for i in range(1, 5)] #[2, 4, 6, 8]

 


예시

리스트 컴프리헨션은 if문과 함께 사용하여 조건을 더할 수 있다.

아래는 리스트 컴프리헨션과 if문을 사용한 다양한 예시이다.

# 5글자 미만인 이름들 반환하기
names = ['Alex', 'Beth', 'Caroline', 'Dave', 'Eleanor', 'Freddie']
short_name = [name for name in names if len(name) < 5]
print(short_name) # ['Alex', 'Beth', 'Dave']



# 5글자 초과하는 이름들을 대문자로 반환하기
names = ['Alex', 'Beth', 'Caroline', 'Dave', 'Eleanor', 'Freddie']
long_name = [name.upper() for name in names if len(name) > 5]
print(long_name) # ['CAROLINE', 'ELEANOR', 'FREDDIE']



# 5글자 초과하는 이름들을 대문자로 반환하기
names = ['Alex', 'Beth', 'Caroline', 'Dave', 'Eleanor', 'Freddie']
long_name = [name.upper() for name in names if len(name) > 5]
print(long_name) # ['CAROLINE', 'ELEANOR', 'FREDDIE']



# 리스트 제곱수로 반환하기
numbers = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
squared_numbers = [num * num for num in numbers]
print(squared_numbers)
[1, 1, 4, 9, 25, 64, 169, 441, 1156, 3025]



# 2의 배수이고 나머지가 없는 수들 반환하기
numbers = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
result = [num for num in numbers if num % 2 ==0]
print(result) # [2, 8, 34]

예제

두 txt 파일에 있는 숫자들을 비교해서 겹치는 파일을 출력하는 식을 리스트 컴프리헨션으로 작성해 보자.

 

file1.text

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
344
42

file1.txt
0.00MB
file2.txt
0.00MB

 

 

# 두 파일 비교해서 겹치는 파일 출력하기
with open('file1.txt') as file1:
    file_1_data = file1.readlines()
with open('file2.txt') as file2:
    file_2_data = file2.readlines()
result = [int(data) for data in file_1_data if data in file_2_data]
print(result)

해당 코드는 두 파일을 비교해 겹치는 내용을 출력하는 코드이다.

먼저 file1.txt와 file2.txt 파일을 읽어들여 각각 데이터를 저장한 후,

file1에 있는 데이터 중 file2에도 포함되는 데이터를 찾아 result 리스트에 저장한다.

이후 result 리스트를 출력합니다.


리스트 컴프리헨션 - 딕셔너리(dictionary) 활용

딕셔너리에서 리스트 컴프리헨션 사용하기

사용방법

# 딕셔너리에서도 리스트 컴프리헨션을 사용할 수 있다.
# 간단한 형태
new_dict = {new_key: new_value for item in list}
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}

예제

1. 각 이름에 1부터 100까지 랜덤의 점수를 부여해서 리스트를 만들어라.

#예제
names = ['Alex', 'Beth', 'Caroline', 'Dave', 'Eleanor', 'Freddie']

#각각의 리스트 객체에 정수를 부여한다.
from random import randint

student_scores = {name:randint(1, 100) for name in names}

print(student_scores)
# {'Alex': 63, 'Beth': 67, 'Caroline': 14, 'Dave': 99, 'Eleanor': 61, 'Freddie': 33}

2. 위에 만든 딕셔너리에서 60점이 넘는 학생들만 출력하라

#예제
names = ['Alex', 'Beth', 'Caroline', 'Dave', 'Eleanor', 'Freddie']
#각각의 리스트 객체에 정수를 부여한다.
from random import randint

student_scores = {name:randint(1, 100) for name in names}
print(student_scores)
# {'Alex': 63, 'Beth': 67, 'Caroline': 14, 'Dave': 99, 'Eleanor': 61, 'Freddie': 33}
passed_student = {name:value for (name, value) in student_scores.items() if value > 60}
print(passed_student)

 

3. 문장을 빈칸 단위로 쪼개 (단어:단어길이) 형태로 딕셔너리에 저장해라

문장

sentence = "What is the Airspeed Velocity of an Unladen Swallow?"

 

# 문장을 빈칸 단위로 쪼개 단어:단어길이 형태로 딕셔너리로 저장하기
sentence = "What is the Airspeed Velocity of an Unladen Swallow?"
sentence_dict = {word: len(word) for word in sentence.split(' ')}
print(sentence_dict) # {'What': 4, 'is': 2, 'the': 3, 'Airspeed': 8, 'Velocity': 8, 'of': 2, 'an': 2, 'Unladen': 7, 'Swallow?': 8}

4. 섭씨온도를 화씨온도로 바꾸어서 딕셔너리에 저장해라.

  • 화씨온도 공식: 섭씨온도에 9/5를 곱한 다음 5로 나누고 32를 더한다.
# 섭씨를 화씨 온도로 바꾸어서 딕셔너리에 요일:화씨온도 형태로 저장하기
# 화씨온도 공식: 섭씨온도에 9/5를 곱한 다음 5로 나누고 32를 더한다.
weather_c = {
    "Monday": 12,
    "Tuesday": 14,
    "Wednesday": 15,
    "Thursday": 14,
    "Friday": 21,
    "Saturday": 22,
    "Sunday": 24,
}
weather_f = {day: degree * 9 / 5 + 32 for (day, degree) 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}

 


딕셔너리 열만 출력하는 방법

student_dict = {
    'student': ['James', 'Lily', 'Julia'],
    'score': [56, 76, 98]
}

for (key, vaule) in student_dict.items():
    print(vaule)
    
#출력결과
['James', 'Lily', 'Julia']
[56, 76, 98]

 

 


판다스를 활용하여 출력하기

student_dict = {
    'student': ['James', 'Lily', 'Julia'],
    'score': [56, 76, 98]
}

# for (key, vaule) in student_dict.items():
#     print(vaule)

import pandas
student_data_frame = pandas.DataFrame(student_dict)
print(student_data_frame)

#출력결과
student  score
0   James     56
1    Lily     76
2   Julia     98

이를 for문을 돌려서 각 열을 볼 수 있다

student_dict = {
    'student': ['James', 'Lily', 'Julia'],
    'score': [56, 76, 98]
}

# for (key, vaule) in student_dict.items():
#     print(vaule)

import pandas
student_data_frame = pandas.DataFrame(student_dict)
# print(student_data_frame)

# 각 열에 있는 데이터를 가져오기
for (index, row) in student_data_frame.iterrows():
    # print(row)
    # print(row.student)
    # print(row.score)
    if row.student == 'Julia':
        print(row.score)
# 이 각각의 행들은 판다스 시리즈의 객체이다.
# 행을 이용할 수 있고 점 표기법을 사용해서 특정 열 이하에 있느 값들을 구할 수 있다.

 


나토 이름 만들기

 

나토 음성 문자란?

주로 무선 통신이나 소음이 많은 곳에서 의미를 분명하게 전달하기 위해 사용한다. (군대나 선박, 비행기 조종사들이 지시나 보고 등의 단어를 말할 때 사용)

 

현재 가장 잘 알려진 NATO 부호는 ICAO와의 협의를 거쳐 1956년부터 공통으로 사용하고 있다.

알파벳 표는 아래 사진과 같다.

이를 리스트 컴프리헨션을 사용하여 만들어 보자.

 

자료는 아래와 같은 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

nato_phonetic_alphabet.csv
0.00MB

조건

1. 판다스를 활용한다.

2. 리스트 컴프리헨션을 최대한 활용하여 리스트/ 딕셔너리를 만들어 결과를 낸다.

3. 이름을 입력하면 각 단어들이 리스트 형식으로 출력되어야 한다.

 

예시

 

나의 풀이

import pandas as pd

nato_alphabet = pd.read_csv('nato_phonetic_alphabet.csv')
nato_alphabet_df = pd.DataFrame(nato_alphabet)

nato_alphabet_dict = {value.letter:value.code for (key, value) in nato_alphabet_df.iterrows()}
print(nato_alphabet_dict)

user_name = input("이름을 입력하세요: ").upper()
user_name_list = [alphabet for alphabet in user_name]

user_name_with_nato = [nato_alphabet_dict[name] for name in user_name_list]
print(user_name_with_nato)

# empty_dict = {}
# for i in user_name_list:
#     empty_dict[i] = nato_alphabet_dict[i]
# print(empty_dict)
  1. 3개의 라이브러리를 import 한다. 판다스 라이브러리를 사용하여 csv 파일을 읽어오고, 사용자로부터 입력받기 위해 built-in 함수인 input을 사용한다. 리스트와 딕셔너리를 만들기 위해 built-in 함수인 iterrows와 DataFrame을 사용한다.
  2. nato_phonetic_alphabet.csv 파일을 읽어와서 판다스 데이터프레임으로 변환한다. 이 데이터프레임에서 각 알파벳에 해당하는 나토 알파벳을 딕셔너리로 저장한다. 이후, 사용자로부터 입력받은 이름을 대문자로 바꾸어 각 알파벳을 리스트에 저장한다.
  3. 딕셔너리에서 각 알파벳에 해당하는 나토 알파벳을 찾아서 리스트에 저장한다. 마지막으로, 사용자의 이름과 해당하는 나토 알파벳 리스트를 출력한다.
#유데미 안젤라 강사님 풀이
import pandas

data = pandas.read_csv("nato_phonetic_alphabet.csv")
#TODO 1. Create a dictionary in this format:
phonetic_dict = {row.letter: row.code for (index, row) in data.iterrows()}
print(phonetic_dict)

#TODO 2. Create a list of the phonetic code words from a word that the user inputs.

word = input("Enter a word: ").upper()
output_list = [phonetic_dict[letter] for letter in word]
print(output_list)

공부 링크: https://www.udemy.com/course/best-100-days-python/learn/lecture/29149442#content

profile

소연의_개발일지

@ssoyxon

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!