개발 꿀팁/PYTHON

Python-- 목록 해석입니다

Jammie 2023. 1. 11. 11:31
반응형

목록 분석의 출현은 Python에게 절대적으로 혁명적인 변화입니다.우리는 매우 간단한 목록 분석 공식을 통해 특정 규칙에 맞는 목록 구성을 완료하거나 함수 프로그래밍에서 map(), filter()와 같은 함수의 역할을 대체할 수 있습니다(함수 프로그래밍은 나중에 요약합니다).

먼저 목록 해석의 구문을 살펴보겠습니다:[expr foriter_val in iterable]
간단히 말해서, 반복 가능한 객체의 각 요소에 대해 식을 통해 요소에 작용하여 계산 결과를 얻은 다음 for 루프를 통해 반복 가능한 객체의 각 요소를 순회하고 작용 후 결과를 목록을 구성하는 것입니다.이 효과의 결과는 이전 요소에서 계산된 새로운 개체이거나 원래 요소일 수 있습니다.

컨셉 자체는 딱히 할 말이 없는데 너무 직관적이지 않아요.그래서 나는 리스트 해석이 어떻게 사용되는지 아래의 예를 들어 설명하겠습니다.

1. 시퀀스의 각 값을 순서대로 계산합니다.
순서를 하나 주려면, 이 순서 중의 매 수의 제곱을 얻어야 합니다

a = [1, 2, 3, 4, 5]
result = [x ** 2 for x in a] # x是元素,列表a是可迭代对象
print(result) # >>> [1, 4, 9, 16, 25]

물론 반복 가능한 대상이 어떤 법칙에 부합한다면 range() 표현으로 나타낼 수도 있습니다

print([x + 1 for x in range(10)]) # >>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

표현은 연산자를 통해 직접 쓸 수 있을 뿐만 아니라, 이미 정의된 함수일 수도 있습니다

def fun(num):
    return 2 * num - 1

print([fun(x) for x in range(3, 10)]) # >>> [5, 7, 9, 11, 13, 15, 17]

2. 체질서열입니다
사실 순서 중의 각 원소에 대한 계산이기도 하지만, 단지 선별하는 기능을 하는 것입니다.

예를 들어, 이제 2~30개의 모든 소수를 선별해서 리스트를 만들고 싶습니다

import math

# 소성 판단 함수를 정의합니다
def isPrime(num):
k = int(math.sqrt(num))
for i in range(2, k + 1):
if num % i == 0:
return False
return True

print([x for x in range(2, 31) if isPrime(x)]) # >>> [2, 3, 5, 7, 11, 13, 19, 23, 29]

3. 여러 쌍을 만듭니다
이제 할 일은 다음과 같은 형태로 2×32×3개의 숫자 쌍을 구성하는 것입니다.

(1,1),(1,2),(1,3),(2,1),(2,2),(2,3)(1,1),(1,2),(1,3),(2,1),(2,2),(2,3)
그러면 리스트 해석식을 통해서 이렇게 생성할 수 있습니다

[(x + 1, y + 1) for x in range(2) for y in range(3)]

4. 통계 문자입니다
물론 목록 해석을 통해 문자열의 문자 수를 계산할 수도 있습니다

s = "I wrote Python"
print(sum([len(i) for i in s.split()])) # >>> 12

이 예에서 먼저 s.split( )을 통해 시퀀스를 구성하고 시퀀스의 각 요소는 문자열 s의 각 단어이며 [len(i) for ins.split( )]을 통해 이러한 단어의 길이로 구성된 목록을 생성하고 마지막으로 sum( ) 함수를 통해 합쳐서 원래 여러 줄의 코드가 필요했던 작업, 목록 해석을 통해 간단한 코드 1줄만 필요함을 알 수 있습니다.

 

반응형