본문 바로가기

TIL

[TIL] #3. List Comprehension

List Comprehesion 이란 ?


List Comprehension은 '리스트 내포'(?)로 번역(점프 투 파이썬에서 저렇게 번역함)할 수 있으며 리스트 객체를 생성하는 방법 중 하나이다. 리스트 안에 반복문과 조건문을 넣음으로써 코드를 직관적으로 보이게 하는 기법이다. 사실 Python에서 List라는 자료구조는 굉장히 사기적인(?) 자료형이라고 생각하는데 이런 자료형을 잘 다루는 것처럼 보이게 하는 좋은 방법인것 같다.🥴 2개 이상의 반복문을 사용하는 것도 가능하지만, 코드가 복잡해지고 직관적이지 못하기 때문에 최대 2개까지만 쓰는 것이 좋다고 한다. 문법은 다음과 같다.

[표현식 for 항목 in 반복 가능 객체 if 조건]

if는 조건이 필요한 경우에만 사용하면 된다.

사용하기


>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> result = []
>>> for num in a:
        result.append(num*3)
>>> print(result)
[3, 6, 9, 12, 15, 18, 21, 24, 27]

위 코드는 a리스트의 각 항목에 3을 곱한 결과를 담은 새로운 list인 result를 만드는 코드이다. List Comprehension을 사용하면

조건문 없을때

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> result = [num*3 for num in a]
>>> print(result)
[3, 6, 9, 12, 15, 18, 21, 24, 27]

한 줄로 해결..! 👍

조건문 있을때

a리스트 항목 중 홀수인 항목에만 3을 곱해서 result에 담으려면??

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> result = [num*3 for num in a if num%2!=0]
>>> print(result)
[3, 9, 15, 21, 27]

조건문 또한 중첩해서 사용 가능한데 주의해야 할 점은 논리 연산자를 사용하지 않는다는 점이다.

>>> numbers = [n for n in range(1,20) if n%2==0 if n%3==0]
>>> print(numbers)
[6, 12, 18]

위 코드는 20미만의 수 중에 2의 배수이고 3의 배수인 수를 담는 리스트를 만든다.(그냥 6의 배수를 담으면 되지만 예제이므로ㅎㅎ;) 조건절 사이에 and 연산자가 없어도 자동으로 and 연산을 수행한다. and를 넣으면 SyntaxError가 발생한다. 아니면 if n%2==0 and n%3==0 이런식으로 넣어줘야 한다.

반복문 중첩

구구단 2단부터 9단까지 결과를 담는 리스트를 만드려면??

>>> result = [a*b for a in range(2,10) for b in range(1,10)]
>>> print(result)
[2, 4, 6, 8, 10, 12, 14, 16, 18, 3, 6, 9, 12, 15, 18, 21, 24, 27, 4, 8, 12, 16, 20, 24, 28, 32, 36, 5, 10, 15, 20, 25, 30, 35, 40, 45, 6, 12, 18, 24, 30, 36, 42, 48, 54, 7, 14, 21, 28, 35, 42, 49, 56, 63, 8, 16, 24, 32, 40, 48, 56, 64, 72, 9, 18, 27, 36, 45, 54, 63, 72, 81]

2차원 배열을 1차원 리스트로 변환하기

>>> complex_list = [[1 ,2 ,3], [4 ,5 ,6], [7 ,8 ,9]]
>>> flat_one = [x for row in complex_list for x in row]
>>> print(flat_one)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

활용


데이터 변환

데이터 타입을 변환할 때(문자열을 정수형으로 바꾸거나 그 외...) 내장 함수인 map() 을 사용할 수 도 있지만 이 경우 리턴값이 map 타입이다. Python에서는 리턴값을 List로 만드는 것이 유리하고(다루기 쉬우니깐) 의미도 명확하게 알 수 있기 때문에 List Comprehension을 이용하여 변환하면 좋다. 물론 내장함수list() 를 사용하여 map 타입을 쉽게 list 로 변환할 수도 있다.

>> [int(x) for x in list(input())]
>> 12345 (입력)
[1, 2, 3, 4, 5]

입력으로 받은 문자열을 int로 변환하여 list로 저장!

2차원 입력값받기 in PS!!

PS를 하다보면 bfs, dfs, 그래프 등 2차원 배열을 입력받는 문제들이 많은데, 예전에 Java로 풀 때는 단순히 이중for문을 이용해서 입력받았던 것을 Python에서는 list comprehension을 이용하여 한 줄만으로 입력을 받을 수 있게 되었다.

<입력>
4 6
0 1 0 0 0 1
1 0 0 0 0 1
0 1 1 0 0 0
0 0 0 1 0 1

>> n, m = map(int, input().split())
>> arr = [list(map(int, input().split())) for _ in range(n)]
[[0, 1, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1], [0, 1, 1, 0, 0, 0], [0, 0, 0, 1, 0, 1]]

PS할 때 많이 써먹을 듯.

참고자료


'TIL' 카테고리의 다른 글

[TIL] #6. HTTP  (0) 2021.03.14
[TIL] #5. sys.stdin.readline()  (0) 2021.03.03
[TIL] #4. sorted()와 sort()  (0) 2021.02.28
[TIL] #2. 자기소개 페이지 만들기  (0) 2021.02.21
[TIL] #1. HTML  (0) 2021.02.10