Comprehesion 정복! (generator 조금..)

About_work·2023년 1월 8일
0

python 기초

목록 보기
5/65

list comprehension 개념

  • 리스트를 쉽게, 짧게 한 줄로 만들 수 있는 파이썬의 문법
  • 다른 언어나, 파이썬에서 comprehension을 쓰지 않을 때 보통의 배열(리스트)를 만드는 과정은
    • 배열 선언: 크기를 정하고, 배열을 특정 이름의 변수에 할당하는 것을 포함
    • 배열 할당: 각 원소에 값을 할당
  • list comprehesion은 선언과 할당을 동시에 1줄로 해결
[ (변수를 활용한 값) for (사용할 변수 이름) in (순회할 수 있는 값) ]
size = 10
arr = [i *2 for i in range(size)]

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

응용

조건문으로 필터링하기

  • 리스트 comprehension은 if 조건문을 쓸 수 있다.
size = 10
arr = [n for n in range(1, 11) if n % 2 == 0]

[2, 4, 6, 8, 10]
  • 조건문 여러개는?.?
    • 조건문 끼리 and로 잇는 것은 가능(근데 and 단어를 안써도 됨)
    • 조건문 끼리 or로 잇는 것은 불가능
arr = [n for n in range(1,31) if n%2 ==0 if n%3 ==0] # 가능
arr = [n for n in range(1, 31) if n%2 == 0 and n%3 ==0] # 가능
arr = [n for n in range(1, 31) if n%2 == 0 or n%3 ==0] # 가능
arr  = [n for n range(1, 31) if n %2 == 0 and if n^3 ==0] # 불가능
arr  = [n for n range(1, 31) if n %2 == 0 or if n^3 ==0] # 불가능

다차원 리스트 다루기

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

# 2차원 -> 1차원 만들기
flat_one = [n for row in arr for n in row]
[1,2,3,4,5,6,7,8,9,10,11,12]

# 차원 2차원으로 유지하면서 원소 제곱하기
squared_list = [[n**2 for n in row] for row in arr]
[[1, 4, 9] ,, [100,121, 144]]

—————————————-

원칙

comprehension에 들어가는 하위 식(조건문 + 루프)이 2개 이하가 되게 하라.

  • 조건문 2개 가능
  • 루프 2개 가능
  • 조건문 1개 + 루프 1개 가능

(조건 부분에서) 대입식을 사용해 comprehension/generator 안에서 반복 잡업을 피하라.

  • 가독성과 성능을 향상시키기 위함.
  • (comprehension/generator에서) 조건이 아닌 부분에도 대입식을 사용할 수 있지만, 그런 형태의 사용은 피해야 한다.
found = {name:batches for name in order if (batches:=get_batches(stock.get(name, 0), 8))}

다른 자료구조의 comprehension

set ( {}) comprehension

set_boy = {n ** 2 for n in range(20)} 
{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}

dict ( {key: value, …} ) comprehension

from string import ascii_lowercase as LOWERS
dict_boy = {c: n for c, n in zip(LOWERS, range(1, 27) ) }
{‘a’ : 1 , ‘b’: 2, ‘c’ : 3,, ‘x’: 24, ‘y’: 25, ‘z’: 26}
  • 하지만 comprehesion을 굳이 안써도 아래와 같이 편하게 만들 수 있으면, 안쓰는 것이 좋다.
print(dict(zip(LOWERS, range(1, len(LOWERS)+1))))

tuple comprehension (?) -> Generator Comprehension (!)

  • tuple comprehension 만드는 것은 조금 이상하다. 한번 더 tuple로 감싸줘야 한다.
tuple_boy = tuple(n for n in range(1, 10))
  • tuple로 감싸지 않으면, Generator을 만드는 Comprehension이 된다.
generator_boy = (n for n in range(1, 10))

<generator object <genexpr> at ~~~>
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글