Home Python 10 - List Comprehension
Post
Cancel

Python 10 - List Comprehension

intro

  • lambda할때 비슷한 형태가 나오긴했는데
    lambda는 익명함수가 메인이었으면
    이건 좀 다름.
  • LC는 for문을 간결하게 쓰는게 목적임.
  • 먼저 일반적인 경우를 생각했을 때

    1
    2
    3
    4
    5
    6
    
    l = []
    for i in range(10):
        if i % 2 == 0:
            l.append(i * i)
      
    print(l)
    

    이 뭉탱이가

    1
    2
    
    nl = [i*i for i in range(10) if i % 2 == 0]
    print(nl)
    

    이렇게 써도 같은 결과를 얻는다.


structure

  • 기본 구성은 다음과같다.

    1
    
      somelist = [ expression(i) for i in data if condition(i)]
    
    • 결과는 somelist로 list.
      • 식을 보면 [ ]으로 묶는데
        그래서 결과도 list인듯.
      • 또, list가 제일 쉬움
    • 몸체는 for문
      • data랑 item 나열
    • condition에 true로 걸리는애들이 1차 결과.
      • 필터라고 생각하면 됨
    • 1차로 걸리진 애들을 expression으로 계산
      • list에 들어갈 최종 item.
      • 딱히 계산이 없어도 var은 있어야함
  • 조건, 계산만 잘 써먹으면
    이것저것 다 쓸 수 있을것 같음.

    1
    2
    3
    4
    5
    6
    
    s = "a dog is a good dog".split()
    l = [i[0] for i in s if len(i) > 2]
      
    print(l)
      
    # ['d', 'g', 'd']
    

for 중첩 - 1

  • for문 중첩을 이용할 수 있음

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    cafelist = ['twosome', 'starbucks']
    coffeelist = ['cappuccino', 'latte']
      
    l = [(cf, cfe) for cfe in coffeelist for cf in cafelist]
    print(l)
      
    #[('twosome', 'cappuccino'), 
    # ('starbucks', 'cappuccino'), 
    # ('twosome', 'latte'), 
    # ('starbucks', 'latte')]
    
  • for 중첩으로 쓸 수 있는데
    사실 이 경우 중첩보다는
    결과 뽑아낼때 형태때문에…


for 중첩 - 2

  • 직접 for이랑 비교해보면

    1
    2
    3
    
    l = [[1,2,3],[4,5,6],[7,8,9]]
    nl = [y for x in l for y in x]
    print(nl)
    
    1
    2
    3
    4
    5
    6
    
    l1 = [[1,2,3],[4,5,6],[7,8,9]]
    nl = []
    for x in l1:
        for y in x:
            nl.append(y)
    print(nl)
    

    둘은 같은 결과로

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

    이게 나옴

  • 한단계 더 해서

    1
    2
    3
    
    l2 = [[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]
    nl = [z for x in l2 for y in x for z in y]
    print(nl)
    
    1
    2
    3
    4
    5
    6
    
    nl = []
    for x in l2:
        for y in x:
            for z in y:
                nl.append(z)
    print(nl)
    

    둘은 같은 결과로

    1
    
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
    
  • 대충 나온것같다.
  • for가 중첩되는경우,
    안쪽블록으로 들어갈 for문이
    LC에서는 오른쪽에 배치하면되고
    결과 item은 가장 왼쪽.

for 중첩 - 3

  • 다음으로
    위 예제는 sublist가 다 꺠진다
    2차 list에서 1차list가 된다.
  • 이 형태를 깨지 않으려면?

    1
    2
    3
    4
    5
    6
    7
    8
    
      l = [[1,2,3],[4,5,6],[7,8,9]]
      nl = []
      for x in l:
          sl = []
          for y in x:
              sl.append(y*y)
          nl.append(sl)
      print(nl)
    

    결과는

    1
    
      [[1, 4, 9], [16, 25, 36], [49, 64, 81]]
    
  • 지금까지 내용으로 LC로 바꾸면

    1
    2
    
      nl = [y*y for x in l for y in x]
      print(nl)
    

    이것밖에 안됨.
    구조가 깨짐.

  • 원하는 결과를 얻으려면

    1
    2
    
    nl = [[x*x for x in y] for y in l]
    print(nl)
    

    이게 원하던 결과인

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

    가 나온다

  • 이 결과는 혼자였으면 절대 몰랐을듯..
  • 근데 [x*x for x in y]
    X로 치환하면
    X for in l로 얼추 비슷해지는데
    X또한 list로 반환한다는점을 보면
    이해가 좀 되는것같기도하고..
  • 지금도 충분히 복잡하니까 3중은 넘어가자..

if 중첩

  • 여기도 중첩이 되는데

    1
    2
    3
    4
    5
    6
    7
    
      l = list(range(50))
        
      l1 = [i for i in l if i % 2 == 0 and i % 3 == 0]
      l2 = [i for i in l if i % 2 == 0 or i % 3 == 0]
      l3 = [i for i in l if i % 2 == 0 if i % 3 == 0]
        
      # [0, 6, 12, 18, 24, 30, 36, 42, 48]
    
  • 딱 이것 ’ 만 ’ 된다
  • 이거 외에 다른식으로 쓰는건 전부 안됨
    • 귀찮아서 안쓰겠음.
  • 통일성있게
    if는 터음에 한번만 쓰고
    뒤에는 and, or붙이는게 좋을것같음.

outro

  • 약간 linq같은 느낌인데 문제는
    for건, if건 중첩이 되면
    애가 좀 망가짐
  • 다른 언어도 마찬가지로
    한 블록안에 들여쓰기가 많아지면
    애가 좀 안이뻐지는데
    python 은 { }도 없어서
    약간 불편한것도 있음.
    이런걸로 간편히 써서
    이쁘게 잘 쓰는게 좋을듯.
  • 단순하게 표현해주는건 맞는데
    간단한 경우에만 써는느낌..
  • 복잡한 경우 map, filter등의
    다른 방법도 있다하니
    더 알게되면 잘 쓰겠지뭐..
This post is licensed under CC BY 4.0 by the author.

Python 9 - DataType Extra

Python 11 - Collection 2

Comments powered by Disqus.