리스트를 쉽게, 짧게 한 줄로 만들 수 있는 파이썬의 문법
[ ( 변수를 활용해 원하는 값 ) 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
'코테 공부 > Python 문법' 카테고리의 다른 글
2869 달팽이는 올라가고 싶다( /와 // 차이) (0) | 2022.08.26 |
---|---|
Python slicing 자세히 a[::-1] (0) | 2022.07.01 |
구현 문제: 시각, 왕실의 나이트 (0) | 2022.07.01 |
Python: bool, list 복사, 변수 생성 (0) | 2022.06.22 |
Python 로또의 최고 순위와 최저 순위[lv.1] (0) | 2022.06.22 |