Python 목록 유도식이 주의해야 할 점

7973 단어 python목록유도식
원문 주소:The Do's and Don'ts of Python List Comprehension
작성자: Yong Cui, Ph.D.
번역문:번역 계획
본문 영구 링크:github.com/xitu/gold-m…
번역자:samyu2000
교정자:luochen1992 , shixi-li
Python 목록 유도식은 초보자에게 사용되지 않는다. 왜냐하면 그것은 매우 반직감적이기 때문이다. 심지어 다른 프로그래밍 언어의 배경이 있는 사람에게도 마찬가지이기 때문이다.
우리가 List의 사용을 접했을 때 배운 내용은 모두 흩어져 있었다.그래서 우리는 다양한 장면에서 List를 어떻게 사용하는지에 대한 지식 체계가 부족하다.
본고는 가능한 한 여러 방면을 포괄하는 List의 사용 지침을 제공하였다.본문이 당신의 원스톱 실용 수첩이 될 수 있기를 바랍니다.
사용 권장 사항
1. 교체하는 방법을 권장
List를 사용하는 가장 기본적인 방법은 교체 가능한 대상을 바탕으로 List 대상을 만드는 것이다. 이 교체 가능한 대상은 임의의 교체 가능한 요소의Python 대상이 될 수 있다.사용 방법은 다음과 같다.

[expression for item in iterable]
다음 코드는 목록 관련 기술로 List 대상을 만드는 예를 보여 줍니다.이 예에서 우리는 Integer 목록을 정의하고 이 대상을 바탕으로 모든 숫자의 제곱수와 입방수를 저장하는 List 대상을 만들었다.

>>> #   Integer  
>>> integers = [1, 2, 3, 4, 5, 6]
>>> #  
>>> powers = [(x*x, pow(x, 3)) for x in integers]
>>> print(powers)
[(1, 1), (4, 8), (9, 27), (16, 64), (25, 125), (36, 216)]

위의 예에서는 List 객체를 교체기로 사용합니다.우리는 많은 유형의 대상도 교체할 수 있다는 것을 알아야 한다. 예를 들어 List, Set, Dictionary와 String 등이다.다른 데이터 형식, 예를 들어range,map,filter,pandas 패키지의 Series,DataFrame은 모두 교체할 수 있다.다음 코드는 일부 대상의 사용 방법을 보여 준다.

>>> #   range  
>>> integer_range = range(5)
>>> [x*x for x in integer_range]
[0, 1, 4, 9, 16]
>>> #   Series   
>>> import pandas as pd
>>> pd_series = pd.Series(range(5))
>>> print(pd_series)
0 0
1 1
2 2
3 3
4 4
dtype: int64
>>> [x*x for x in pd_series]
[0, 1, 4, 9, 16]
2. 만약 그 중의 일부 요소만 사용한다면 조건 판단 문장을 사용해야 한다
어떤 조건에 부합되는 요소를 집합시켜list를 만들어야 한다고 가정하십시오.다음은 관련 문법을 보여 준다.

[expression for item in iterable if condition]
if 문장은 조건 판단을 실현하는 데 쓰인다.아래의 코드는 이런 용법의 간단한 예시를 보여 준다.

>>> #   Integer  
>>> integers = [1, 2, 3, 4, 5, 6]
>>> #  , 
>>> squares_of_evens = [x*x for x in integers if x % 2 == 0]
>>> print((squares_of_evens))
[4, 16, 36]
3. 조건판단 문구 사용
List 객체에서는 다음과 같은 구문을 사용하여if-else 형식의 조건 판단도 사용할 수 있습니다.

[expression0 if condition else expression1 for item in iterable]
이것은 앞의 그런 용법과 약간 유사하니, 이 두 가지 용법을 혼동하지 마라.이 예에서 조건문 자체는 하나의 전체이다.아래의 코드는 예를 제공했다.

>>> #   Integer  
>>> integers = [1, 2, 3, 4, 5, 6]
>>> #   integers  , , 
>>> #  , 
>>> custom_powers = [x*x if x % 2 == 0 else pow(x, 3) for x in integers]
>>> print(custom_powers)
[1, 4, 27, 16, 125, 36]
4. 중첩된 구조가 있으면 중첩된 순환을 사용할 수 있다
비록 이런 상황은 흔하지 않지만, 교체 가능한 대상 중의 원소 자체도 교체 가능한 것이다.만약 플러그인 교체 대상에 관심이 있다면, for를 사용하여 순환 플러그인을 실현할 수 있습니다.문법은 다음과 같다.

[expression for item_outer in iterable for item_inner in item_outer]

#  
for item_outer in iterable:
 for item_inner in item_outer:
  expression
위의 코드는 for를 사용하여 플러그인 순환을 실현하는 예를 보여 준다.

>>> #  
>>> prices = [('$5.99', '$4.99'), ('$3.5', '$4.5')]
>>> #  , 
>>> prices_formatted = [float(x[1:]) for price_group in prices for x in price_group]
>>> print(prices_formatted)
[5.99, 4.99, 3.5, 4.5]
5. 고급 함수 교체
어떤 사람들은 함수식 프로그래밍에 익숙하다. 예를 들어 고급 함수를 사용하는 것도 이런 습관의 표현 중의 하나이다.특히 고급 함수는 입력이나 출력 파라미터를 사용해야 하는 함수입니다.Python에서 자주 사용하는 고급 함수는map () 과 filter () 입니다.

>>> #   integer  
>>> integers = [1, 2, 3, 4, 5]
>>> #   map  
>>> squares_mapped = list(map(lambda x: x*x, integers))
>>> squares_mapped
[1, 4, 9, 16, 25]
>>> #  
>>> squares_listcomp = [x*x for x in integers]
>>> squares_listcomp
[1, 4, 9, 16, 25]
>>> #   filter   integers  
>>> filtered_filter = list(filter(lambda x: x % 2 == 0, integers))
>>> filtered_filter
[2, 4]
>>> #   integers  
>>> filterd_listcomp = [x for x in integers if x % 2 == 0]
>>> filterd_listcomp
[2, 4]

위의 예에서 알 수 있듯이list의 일부 특성을 사용하는 것은 고급 함수를 사용하는 것보다 가독성이 높고 복잡한 끼워넣기 구조를 실현할 수 있다.
사용 금지
1. 구조 함수를 정의하는 것을 잊지 마라
어떤 사람들은 목록 유도식이 멋있고 파이썬 특유의 기능이라고 생각하기 때문에 자신의 파이썬 수준을 자랑하기 위해 더 좋은 대안이 있어도 사용해야 한다.

>>> #   range  
>>> numbers = [x for x in range(5)]
>>> print(numbers)
[0, 1, 2, 3, 4]
>>> #  , 
>>> letters = [x.lower() for x in 'Smith']
>>> print(letters)
['s', 'm', 'i', 't', 'h']
상기 예에서 우리는range와string을 사용했는데 이 두 가지 데이터 구조는 모두 교체할 수 있고list () 구조 함수는iterable를 직접적으로list 대상을 만들 수 있다.아래의 코드는 더욱 합리적인 해결 방안을 제공했다.

>>> #   range  
>>> numbers = list(range(5))
>>> print(numbers)
[0, 1, 2, 3, 4]
>>> #  , 
>>> letters = list('Smith'.lower())
>>> print(letters)
['s', 'm', 'i', 't', 'h']

2. 생성기 표현식 잊지 마세요
Python에서 생성기는 요청이 있을 때까지 요소를 불러오는 것을 지연시키는 특수한 교체 대상입니다.이것은 대량의 데이터를 처리할 때 매우 효율적이며 저장 효율을 높일 수 있다.이에 비해list 대상은 계수와 색인을 편리하게 하기 위해 모든 요소를 한꺼번에 만듭니다.따라서 생성기에 비해 원소의 개수와 동시에list는 더 많은 메모리를 차지해야 한다.
우리는 생성기를 만들기 위해 생성기 함수를 정의할 수 있다.우리도 다음 문장을 사용하여 생성기를 만들 수 있다. 이것은 생성기 표현식이라고 불리는 방법이다.

(expression for item in iterable)
괄호를 사용하는 것 외에 문법은list를 사용하는 문장과 매우 비슷하다는 것을 알 수 있을 것이다.그래서 구분에 주의해야 한다.
아래의 이 예를 고려하다.우리는 백만 개의 숫자의 제곱을 계산해야 한다.list를 사용하면 방법은 다음과 같습니다.

>>> #   squares 
>>> squares = [x*x for x in range(10_000_000)]
>>> #  
>>> sum(squares)
333333283333335000000
>>> squares.__sizeof__()
81528032
list를 사용하는 것보다 generator 메모리를 사용하는 비용이 훨씬 적고 96바이트밖에 안 됩니다.원인은 간단하다. generator는 모든 원소를 얻을 필요가 없다.반대로 각 원소가 서열에 있는 위치를 가져와 다음 원소를 만들고 보여주기만 하면 메모리에 저장할 필요가 없다.
결론
본고에서 우리는list 응용의 관건적인 요령을 정리했다.이런 해야 할 일과 하지 말아야 할 일은 모두 매우 명확하다.나는 네가 적당한 장면에서 그것을 사용할 것이라고 생각한다.다음은 본문 내용의 소결이다.
  • 교체 방식을 사용한다.Python에는 많은 종류의 iterable이 있습니다. 기초 (list와tuple) 를 파악하는 동시에 융통되어야 합니다..
  • 사용 조건 판단 문장.만약 당신이iterable에서 어떤 원소를 선별하는 것에 흥미가 있다면, 조건을 많이 연구하여 판단할 수 있습니다
  • 사용 조건 판단 표현식.만약 선택적으로 어떤 데이터를 얻을 필요가 있다면, 조건 판단 표현식을 사용할 수 있다..
  • 중첩된 순환을 사용합니다.플러그인iterable를 처리하려면 플러그인의 순환 구조를 사용할 수 있습니다.
  • 높은 함수를 list로 대체하는 경우가 많은데, 높은 함수를 list로 대체할 수 있다..
  • list의 구조 함수가list의 구조 함수를 정의하는 것을 잊지 마세요.iterable를 사용하여list 대상을 만들 수 있습니다.만약 당신이iterable를 직접 사용한다면, 이 방법을 추천합니다.
  • 생성기 표현식의 문법은list의 문법과 비슷하다는 것을 잊지 마세요.대량의 대상을 처리할 때, 이것은 메모리 비용을 절약하는 방법이다.list와generator는 다른 것은 앞으로의 인덱스와 접근을 위해list는 미리 만들어야 합니다. 원소의 개수가 많으면 메모리가 많이 소모됩니다
  • 이상은Python 목록 유도식이 주의해야 할 부분의 상세한 내용입니다. Python 목록 유도식에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기