코테 공부/Python 문법

List Comprehension

prefer_all 2022. 7. 1. 18:50

리스트를 쉽게, 짧게 한 줄로 만들 수 있는 파이썬의 문법

[ ( 변수를 활용해 원하는 값 ) for ( 사용할 변수 이름 ) in ( 순회할 수 있는 값 )]

size = 10
arr = [0] * size
for i in range(len(size)):
    arr[i] = i * 2

''' 이렇게 바꿈'''
size = 10
arr = [i * 2 for i in range(size)]

생성되는 리스트의 크기는 순회하는 값에 맞게 자동으로 결정된다

word = '가나다'

print([c * 2 for c in word])

['가가', '나나', '다다']

 

더 많은 예제

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
>>> [(x, x**2) for x in range(6)]
[(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25)]

 

one dimensional VS two dimensional

>>> case_1 = ["A","B","C"]
>>> case_2 = ["D","E","A"]
['AD', 'AE', 'AA', 'BD', 'BE', 'BA', 'CD', 'CE', 'CA']
>>> result = [i+j for i in case_1 for j in case_2]
>>> result
['AD', 'AE', 'AA', 'BD', 'BE', 'BA', 'CD', 'CE', 'CA']
>>> result = [ [i+j for i in case_1] for j in case_2]
>>> result
[['AD', 'BD', 'CD'], ['AE', 'BE', 'CE'], ['AA', 'BA', 'CA']]

필터링: if

size = 10
arr = [n for n in range(1, 11) if n % 2 == 0]

print(arr)

[2, 4, 6, 8, 10]
arr = [n for n in range(1, 31) if n % 2 == 0 if n % 3 == 0]
print(arr)

[6, 12, 18, 24, 30]

''' and는 사용해서 안됨 '''
arr = [n for n in range(1, 31) if n % 2 == 0 and if n % 3 == 0]

SyntaxError: invalid syntax

''' or은 가능 '''
arr = [n for n in range(1, 16) if n % 2 == 0 or n % 3 == 0]
print(arr)

[2, 3, 4, 6, 8, 9, 10, 12, 14, 15]

2차원 행렬 다루기

1. 차원 축소

arr = [[1, 2, 3], 
       [4, 5, 6],
       [7, 8, 9],
       [10, 11, 12],
      ]

print(len(arr))
print(len(arr[0]))
>>>4
>>>3
flat_one = [n for row in arr for n in row]
print(flat_one)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]

''' same as '''
flat_one2 = []
for row in arr:
    for n in row:
        flat_one2.append(n)

print(flat_one2)

n for row in arr for n in row

 

''' 같은 거임. 근데 변수명 좀 바꿨다고 되게 달라보임 '''
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

 

'''same as '''
v = [list(range(10)), [10, 11, 12]]
for i in v:
	for j in i:
    		print(j)

2. 2차원 list 값 변경

squared_list = [[n ** 2 for n in row] for row in arr]
print(squared_list)

[[1, 4, 9], [16, 25, 36], [49, 64, 81], [100, 121, 144]]

 

그 외 예제 

>>> matrix = [
...     [1, 2, 3, 4],
...     [5, 6, 7, 8],
...     [9, 10, 11, 12],
... ]

>>> [[row[i] for row in matrix] for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

[ [row[i] for row in matrix] for i in range(4) ]

''' same as '''
>>> transposed = []
>>> for i in range(4):
...     transposed.append([row[i] for row in matrix])
...
>>> transposed
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

* 다른 자료형에서도 Comprehension 가능

- Dict

{ a: b for a, b in zip( , ) }

from string import ascii_lowercase as LOWERS

dict_boy = {c: n for c, n in zip(LOWERS, range(1, 27))}
print(dict_boy)

{'a': 1, 'b': 2, 'c': 3, ..., 'x': 24, 'y': 25, 'z': 26}

''' as same as '''
print(dict (zip(LOWERS, range(1, len(LOWERS)+1))) )

- set

set_boy = {n ** 2 for n in range(10)}

''' 변수 그대로 set를 만들거면 comprehension 굳이 쓸 필요 없음'''
print(set(range(10)))

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

- tuple

''' 이렇게 하면 안됨 '''
tuple_boy = (n for n in range(1, 10))
print(tuple_boy)

<generator object <genexpr> at 0x7f1ac8177db0>

''' 이렇게 해야 함 '''
tuple_boy = tuple(n for n in range(1, 10))
print(tuple_boy)

(1, 2, 3, 4, 5, 6, 7, 8, 9)

 

 

참고한 사이트:

https://shoark7.github.io/programming/python/about-list-comprehension-python

 

[Python] list comprehension에 대한 즐거운 이해

리스트를 생성하는 Python만의 독특한 문법인 list comprehension에 대해 살펴보고 다양한 예제를 만들어봅니다. 그리고 set, tuple, dict와 같은 다른 내장 자료구조에도 적용해봅니다.

shoark7.github.io

https://docs.python.org/ko/3/tutorial/datastructures.html

 

5. 자료 구조 — Python 3.10.5 문서

5. 자료 구조 이 장에서는 여러분이 이미 배운 것들을 좀 더 자세히 설명하고, 몇 가지 새로운 것들을 덧붙입니다. 5.1. 리스트 더 보기 리스트 자료 형은 몇 가지 메서드들을 더 갖고 있습니다. 이

docs.python.org