파이톤으로 목록을 작성하는 방법 이해

How to Python 시리즈의 또 다른 기사로 돌아온 것을 환영합니다.이번에 나는 파이톤의 내장된 특성인 목록 이해에 대해 한 걸음 물러서서 이야기하고 싶다.비록 우리는 이 시리즈에서 몇 번 사용했지만, 이제서야 나는 비로소 그것들을 진정으로 설명하고 싶다.

질문


이 시리즈의 다른 문장과 달리 본고는 구체적인 문제가 없다.반대로 목표는 목록을 이해하고 문법을 이해하는 것이다.
nums = [2, 6, 10, -4] 
negative_nums = [x for x in nums if x < 0]
이런 이상한 문법은 무엇입니까? 그것은 어떻게 일합니까?이것이 바로 오늘 이 문장의 목표다.특히 다음과 같은 유용한 장면을 이해하기 위한 목록을 살펴보겠습니다.
  • 복제 목록
  • 수정 목록
  • 필터 목록
  • 목록 필터링 및 수정
  • 두 개의 목록
  • 에서 모든 쌍 생성
  • 복제 네스트된 목록
  • 만약 우리가 목록을 통해 무엇을 이해할 수 있는지 알고 있다면, 나에게 말해 주세요!

    해결하다


    해결 방안을 깊이 연구하기 전에 문법에 대해 토론합시다.다음은 이 개념에 대한 나의 가장 좋은 설명이다.
    output = [expression(item) for item in some_list]
    
    가장 기본적인 차원에서 우리는 하나의 목록 이해를 구축할 수 있다. 이것은 특정한 목록의 모든 항목을 교체하고, 이 항목에 대해 표현식을 실행하며, 새로운 항목을 출력 목록에 넣을 수 있다.또는 하나의 순환으로
    output = [] 
    for item in some_list: 
      output.append(expression(item))
    
    물론 우리가 할 수 있는 일은 다른 목록에서 목록을 만드는 것만은 아니다.아래의 소절에서 우리는 몇 가지 예를 볼 것이다.

    목록 복사


    아마도 목록이 이해하는 가장 간단한 방법은 다른 목록을 복제하는 것이다.
    my_list = [2, 5, -4, 6] 
    output = [item for item in my_list] # [2, 5, -4, 6]
    
    이 경우 outputmy_list와 같다.완전하게 보기 위해 다음은 순환과 같은 해결 방안이다.
    my_list = [2, 5, -4, 6] 
    output = [] 
    for item in my_list: 
      output.append(item)
    
    우리가 본 바와 같이 목록은 훨씬 간결하게 이해해야 한다.어떠한 상황에서도 우리는 얕은 층 복제만 실행할 것이다. 이것은 새 목록의 항목이 이전 목록의 같은 항목을 가리킬 수 있음을 의미하기 때문에 이 문법으로 숫자와 같은 변하지 않는 값의 목록만 복제하는 것이 가장 좋다.

    목록 수정*


    이제 목록을 복사하는 방법을 알게 되었으므로 출력 목록에 항목을 추가하기 전에 목록을 수정해 보겠습니다.
    my_list = [2, 5, -4, 6] 
    output = [2 * item for item in my_list] # [4, 10, -8, 12]
    
    원본 목록을 직접 복사하지 않고 새 목록에 저장하기 전에 항목을 2로 곱해서 수정합니다.그래서 우리는 마침내 하나의 목록을 얻었는데, 그 중 모든 용어의 크기는 원시 목록의 두 배이다.다음은 순환을 사용하는 동일한 개념이다.
    my_list = [2, 5, -4, 6] 
    output = [] 
    for item in my_list: 
      output.append(item * 2)
    
    분명히 말하자면, 성호가 암시할 수 있는 것처럼, 우리는 사실상 원래의 목록을 바꾸지 않았다.반대로, 우리는 새로운 목록을 만들었고, 항목이 배로 증가했다.
    만약 my_list 대상이나 다른 가변 데이터 형식 (예를 들어 목록) 을 포함한다면, 우리가 그것들을 수정하는 것을 막을 수 있는 것은 아무것도 없다.물론 이것은 좋지 않은 방법으로 여겨지기 때문에, 나는 그것을 생산 시스템에 마음대로 복제할 가능성이 높기 때문에, 하나의 예를 공유하는 것을 소홀히 했다.

    목록 필터링


    목록을 복사하고 수정하는 것은 흥미롭지만, 때때로 목록을 필터할 수 있는 것이 도움이 된다.
    my_list = [2, 5, -4, 6] 
    output = [item for item in my_list if item < 0] # [-4]
    
    이 예에서, 우리는 목록의 맨 오른쪽에 새로운 표현식을 추가했다. 즉, if item < 0.물론 순환 등가물은 다음과 같다.
    my_list = [2, 5, -4, 6] 
    output = [] 
    for item in my_list: 
      if item < 0: 
        output.append(item)
    
    목록의 모든 항목에 대해 0보다 작을 때만 고려한다는 것이다.해당하는 경우 새 목록에 덤프합니다.결과적으로, 우리는 마이너스만 포함하는 목록을 얻었다.

    목록 필터링 및 수정


    물론 우리는 조합 문법을 통해 목록을 동시에 수정하고 필터할 수 있다.
    my_list = [2, 5, -4, 6] 
    output = [2 * item for item in my_list if item < 0] # [-8]
    
    이 예에서, 우리는 결과를 목록에 저장하기 전에 모든 마이너스를 배로 늘리기로 결정했다.마찬가지로 순환과 같은 문법은 유사할 수 있다.
    my_list = [2, 5, -4, 6] 
    output = [] 
    for item in my_list: 
      if item < 0: 
        output.append(item * 2)
    
    따라서 출력 목록은 -8만 포함됩니다.다시 한 번 강조하지만, 우리는 원시 목록을 진정으로 수정하지 않았다.

    두 목록에서 모든 쌍 생성


    이제 리스트 이해의 고급 기능들을 알아보자.특히 우리는 두 목록 사이에 쌍의 값을 생성하기를 원한다.
    # [(1, 2), (1, 4), (1, 6), (3, 2), (3, 4), (3, 6), (5, 2), (5, 4), (5, 6)] 
    output = [(a, b) for a in (1, 3, 5) for b in (2, 4, 6)]
    
    여기에 두 목록에서 온 모든 쌍의 조합을 포함하는 목록을 만들었습니다.우리는 항상 그렇듯이 다음 루프를 통해 동일한 기능을 수행할 수 있습니다.
    output = [] 
    for a in (1, 3, 5): 
      for b in (2, 4, 6): 
        output.append((a, b))
    
    만약 우리가 일을 더욱 재미있게 하고 싶다면, 우리는 몇 가지 필터를 적용할 수 있다.
    # [(3, 2), (5, 2), (5, 4)] 
    output = [(a, b) for a in (1, 3, 5) for b in (2, 4, 6) if a > b]
    
    이런 상황에서 첫 번째 목록의 숫자가 두 번째 목록의 숫자보다 클 때만 우리는 한 쌍을 만들 수 있다.

    중첩 목록 반복


    앞에서 언급한 얕은 층 복제 예시에서, 우리는 2차원 행렬과 같은 중첩 목록을 복제할 수 없다.이를 위해 네스트된 목록을 사용하여 다음과 같은 내용을 이해할 수 있습니다.
    my_list = [[1, 2], [3, 4]] 
    output = [[item for item in sub_list] for sub_list in my_list] 
    print(output) # Prints [[1, 2], [3, 4]]
    
    우리는 모든 목록을 검색하고 표면적인 복제가 아니라 이전과 같은 이해를 사용하여 복제합니다.당신이 상상할 수 있는 것처럼 우리는 이 개념을 귀속 함수로 추상화할 수 있다. 이 함수는 행렬의 각 차원 실행 목록에 대해 이해할 수 있다.
    def deep_copy(to_copy): 
      if type(to_copy) is list: 
        return [deep_copy(item) for item in to_copy] 
      else: 
        return to_copy
    
    이게 얼마나 멋있어요?물론 행렬의 가장 깊은 곳에 숫자나 문자열 이외에 다른 것이 있다면, 나머지 복제 과정을 스스로 처리해야 한다.

    짧게 한번 돌아볼게요.


    여느 때와 마찬가지로 이곳에는 커다란 쓰레기 더미가 있는데, 그 안에는 본고에서 소개한 모든 예시와 각 부분을 간략하게 설명하는 주석이 있다.네가 필요로 하는 물건을 마음대로 가지고 가라!
    # Define a generic 1D list of constants 
    my_list = [2, 5, -4, 6] 
    
    # Duplicate a 1D list of constants 
    [item for item in my_list] 
    
    # Duplicate and scale a 1D list of constants 
    [2 * item for item in my_list] 
    
    # Duplicate and filter out non-negatives from 1D list of constants 
    [item for item in my_list if item < 0] 
    
    # Duplicate, filter, and scale a 1D list of constants 
    [2 * item for item in my_list if item < 0] 
    
    # Generate all possible pairs from two lists 
    [(a, b) for a in (1, 3, 5) for b in (2, 4, 6)] 
    
    # Redefine list of contents to be 2D 
    my_list = [[1, 2], [3, 4]] 
    
    # Duplicate a 2D list 
    [[item for item in sub_list] for sub_list in my_list] 
    
    # Duplicate an n-dimensional list 
    def deep_copy(to_copy): 
      if type(to_copy) is list: 
        return [deep_copy(item) for item in to_copy] 
      else: 
        return to_copy
    
    나는 네가 목록에 대한 이해에 관한 이 글을 읽을 때와 내가 이 글을 쓸 때처럼 즐겁기를 바란다.나는 이 시리즈의 이 점에서 이러한 기본 개념을 탐색하고 그것을 극한까지 확대할 것이라고 생각한다.탐색하고 싶은 파이썬 개념이 있습니까?알려줘!
    그리고 왜 다른 좋은 파이썬 문장을 보지 않았을까.

  • How to Check if a File Exists in Python

  • 만약 당신이 매우 관대하다고 생각한다면 members page에 가서 당신의 선택을 볼 수 있습니다.구매하기 전에 사용해 보신 것을 환영합니다.이것이 바로 왜 있는가a free option.어쨌든 당신의 지지에 다시 한 번 감사 드립니다.빨리 돌아와!

    좋은 웹페이지 즐겨찾기