파이썬/파이썬(python) 중급

[26-1 파이썬] 리스트 컴프리핸션 List comprehension

Olivia-BlackCherry 2022. 9. 11. 20:25

코딩을 할 때, 

중요한 것이 무엇이라고 생각하는가?

 

똑같은 결과를 출력한다고 하면, 

읽는 사람이 코드를 읽고

무슨 의미인지 한눈에 파악할 수 있도록 하는 것이

중요하다고 생각한다. 

 

그렇게 되려면, 

코드가 간결해야 한다. 

 

리스트 컴프리핸션 list comprehension은

파이썬의 독특한 특징 중의 하나인데

긴 코드를 간결하게 한 줄로 줄여 쓸 수 있도록 해준다.

 

리스트 컴프리핸션(=리스트 내포)은

iterable(반복가능)한 sequence(순서)가 있는 데이터로부터 새롭게 리스트를 만드는 것이다. 

 

리스트 컴프리핸션이 없었다면

for loop를 사용해서 아래와 같이 코딩해야 한다.

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

[2, 3, 4]

 

리스트 컴프리핸션을 사용하면 

아래와 같이 간결하게 줄일 수 있다.

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

 

코드가 매우 간결하고, 읽기에도 쉽다!

리스트 컴프리핸션의 기본 공식은 아래와 같다. 

new_list = [new_item for item in list]

[ ] : 대괄호를 친다.

new_list : 새로운 리스트의 이름

list : 반복할 목록(이터러블한 시퀀스가 있는 데이터- string 문자열, list 리스트,  range 레인지, tuple 튜플)

item : 목록에 있는 요소로, 내가 원하는대로 부를 수 있다. 

new_item : new item을 얻기 위해 실행해야 하는 표현식 또는 코드 

 

list 안의 요소들을 하나씩 꺼내어 어떤 표현식을 거쳐 new_item으로 만든다음, 

new_list라는 새로운 리스트에 new item을 저장한다. 

 

result = [n*2 for n in range(1,5)]
print(result)

[2, 4, 6, 8]

 

 

이번에는 조건식을 포함한 리스트컴프리핸션의 기본 공식을 설명한다. 

new_list = [new_item for item in list if test]

[ ] : 대괄호를 친다.

new_list : 새로운 리스트의 이름

 

if test : test는 조건이다. 해당 조건을 만족하는 item만 new item이 되기 위한 표현식을 수행한 후, new_list에 저장된다.

 

list : 반복할 목록(이터러블한 시퀀스가 있는 데이터- string 문자열, list 리스트,  range 레인지, tuple 튜플)

item : 목록에 있는 요소로, 내가 원하는대로 부를 수 있다. 

new_item : new item을 얻기 위해 실행해야 하는 표현식 또는 코드 

list 안의 요소들을 하나씩 꺼내어 어떤 표현식을 거쳐 new_item으로 만든다음, 

new_list라는 새로운 리스트에 new item을 저장한다. 

 

<예제>

numbers = [1, 2, 3, 4, 5, 6]
result = [n/2 for n in numbers if n%2 == 0]
print(result)

[1.0, 2.0, 3.0]

 

numbers = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
result = [number **2 for number in numbers if number < 5]
print(result)

[1, 1, 4, 9]

 

a_numbers = [1,4,6,2,5,3,8]
b_numbers = [1,3,9,11,19,29]
result = [n for n in b_numbers if n in a_numbers]
print(result)

[1, 3]

 

 

이전 문제에서 리스트컴프리핸션 적용하여 코드 바꿔보기

missing_states = []
for state in all_states:
    if state not in guessed_states:
        missing_states.append(state)
missing_states= [state for state in all_states if state not in guessed_states]