Programing

Python 3에서 필터, 맵 및 축소 사용 방법

c10106 2022. 3. 8. 21:51
반응형

Python 3에서 필터, 맵 및 축소 사용 방법

filtermap그리고reduce파이톤 2에서 완벽하게 작동하다.예를 들면 다음과 같다.

>>> def f(x):
        return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

>>> def cube(x):
        return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

>>> def add(x,y):
        return x+y
>>> reduce(add, range(1, 11))
55

그러나 Python 3에서는 다음과 같은 출력을 받는다.

>>> filter(f, range(2, 25))
<filter object at 0x0000000002C14908>

>>> map(cube, range(1, 11))
<map object at 0x0000000002C82B70>

>>> reduce(add, range(1, 11))
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    reduce(add, range(1, 11))
NameError: name 'reduce' is not defined

이게 왜 그런지 누가 설명해 주면 고맙겠어.

코드의 스크린샷을 통해 보다 명확한 내용 확인:

Python 2 및 3의 DILE 세션

당신은 What's News In Python 3.0의 변화에 대해 읽을 수 있다.2.x에서 3.x로 이동할 때는 많이 바뀌었으니까 잘 읽어야 해.

여기서의 전체 답은 설명서에서 인용한 것이다.

목록 대신 보기 및 반복기

일부 잘 알려진 API는 더 이상 반환 목록이 아님:

  • [...]
  • map() 그리고 반복기를 돌려주시오.만약 당신이 정말로 리스트가 필요하다면, 빠른 해결책은 예를 들어이다.list(map(...))그러나 더 나은 해결책은 목록 이해(특히 원본 코드가 람다를 사용할 때)를 사용하거나, 목록이 전혀 필요하지 않도록 코드를 다시 쓰는 것이다.특히 까다로운 것은map()기능의 부작용에 대해 호출됨; 올바른 변환은 정규 분포를 사용하는 것이다.for(목록을 작성하는 것은 낭비일 뿐이므로)
  • [...]

빌트인

  • [...]
  • 제거된reduce()만약 당신이 정말로 그것이 필요하다면 사용하라; 그러나, 99퍼센트의 시간들은 명시적이다.for루프는 더 읽기 쉽다.
  • [...]

의 기지의 map그리고filter반복기를 반환하기 위해 의도적으로 변경되었고, 감소가 내장형에서 제거되어 에 배치되었다.functools.reduce.

그러니깐filter그리고map로 포장할 수 있다.list()예전처럼 결과를 보기 위해서요

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> list(filter(f, range(2, 25)))
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x): return x*x*x
...
>>> list(map(cube, range(1, 11)))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> import functools
>>> def add(x,y): return x+y
...
>>> functools.reduce(add, range(1, 11))
55
>>>

지금 권장하는 것은 맵과 필터의 사용을 제너레이터 식이나 목록 포괄성으로 바꾸는 것이다.예:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> [i for i in range(2, 25) if f(i)]
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x): return x*x*x
...
>>> [cube(i) for i in range(1, 11)]
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>>

것이 % %가 99%의 시시콜콜한 동지를 functools.reduce.

편집: 99% 수치는 Guido van Rossum이 작성한 What's New In Python 3.0 페이지에서 직접 가져온 것이다.

다른 답변의 부록으로, 이것은 목록을 반환하고 소개할 기능에 이러한 기능의 이름을 다시 매핑하는 컨텍스트 관리자에게는 훌륭한 사용 사례처럼 들린다.reduce글로벌 네임스페이스에 저장하십시오.

빠른 구현은 다음과 같이 보일 수 있다.

from contextlib import contextmanager    

@contextmanager
def noiters(*funcs):
    if not funcs: 
        funcs = [map, filter, zip] # etc
    from functools import reduce
    globals()[reduce.__name__] = reduce
    for func in funcs:
        globals()[func.__name__] = lambda *ar, func = func, **kwar: list(func(*ar, **kwar))
    try:
        yield
    finally:
        del globals()[reduce.__name__]
        for func in funcs: globals()[func.__name__] = func

다음과 같은 사용법을 사용할 경우:

with noiters(map):
    from operator import add
    print(reduce(add, range(1, 20)))
    print(map(int, ['1', '2']))

인쇄 대상:

190
[1, 2]

내 2센트만:-)

그 이후reducePython3의 내장 함수에서 메서드가 제거되었으므로 가져오는 것을 잊지 마십시오.functools아래 코드 조각을 보십시오.

import functools
my_list = [10,15,20,25,35]
sum_numbers = functools.reduce(lambda x ,y : x+y , my_list)
print(sum_numbers)

지도, 여과 및 축소의 장점 중 하나는 복잡한 것을 하기 위해 그것들을 "연쇄"할 때 그들이 얼마나 읽기 쉬워지는가이다.하지만, 내장된 구문은 읽을 수 없고 모두 "뒤로" 읽힌다.그래서, 나는 그 제품을 사용하는 것을 제안한다.PyFunctional패키지(https://pypi.org/project/PyFunctional/).두 가지를 비교해 보자.

flight_destinations_dict = {'NY': {'London', 'Rome'}, 'Berlin': {'NY'}}

PyFunctional 버전

읽기 쉬운 구문.다음과 같이 말할 수 있다.

"비행 목적지 순서가 있어.그 중에서 도시가 명령어 값 안에 있다면 나는 명령어 키를 얻고 싶다.마지막으로 그 과정에서 내가 만든 빈 리스트를 걸러내라."

from functional import seq  # PyFunctional package to allow easier syntax

def find_return_flights_PYFUNCTIONAL_SYNTAX(city, flight_destinations_dict):
    return seq(flight_destinations_dict.items()) \
        .map(lambda x: x[0] if city in x[1] else []) \
        .filter(lambda x: x != []) \

기본 Python 버전

모두 거꾸로다.당신은 다음과 같이 말할 필요가 있다.

"좋아, 그럼, 명단이 있군.빈 리스트를 걸러내고 싶은데 왜?왜냐하면 도시가 받아쓰기 가치에 있다면 내가 먼저 받아쓰기 키를 받았기 때문이다.아, 내가 하고 있는 리스트는 flight_destives_dict."

def find_return_flights_DEFAULT_SYNTAX(city, flight_destinations_dict):
    return list(
        filter(lambda x: x != [],
               map(lambda x: x[0] if city in x[1] else [], flight_destinations_dict.items())
               )
    )

필터, 지도 및 축소 기능의 예는 다음과 같다.

숫자 = [10,11,12,22,34,34,43,54,34,67,87,88,98,99,87,44,66]

//필터

홀수 번호 = 목록(필터(lambda x: x%2 != 0, 숫자)

인쇄(oddNumberg)

//지도

multiOf2 = 목록(map(lambda x: x*2, 숫자)

인쇄(멀티플라이Of2)

//축소

일반적으로 사용되지 않기 때문에 감소 함수는 파이톤 3에서 내장 함수에서 제거되었다.Functools 모듈에서는 여전히 사용할 수 있으므로 다음을 수행할 수 있다.

functools에서 수입감소.

SumOfNumberg = 감소(lambda x,y: x+y, 숫자)

인쇄(SumOfNumbers)

from functools import reduce

def f(x):
    return x % 2 != 0 and x % 3 != 0

print(*filter(f, range(2, 25)))
#[5, 7, 11, 13, 17, 19, 23]

def cube(x):
    return x**3
print(*map(cube, range(1, 11)))
#[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

def add(x,y):
    return x+y

reduce(add, range(1, 11))
#55

그것은 있는 그대로 작동한다.맵 출력을 가져오려면 * 또는 목록을 사용하십시오.

람다

일반 정의 함수와 람다 함수의 차이를 이해하도록 노력하십시오.지정된 값의 큐브를 반환하는 프로그램:

# Python code to illustrate cube of a number 
# showing difference between def() and lambda(). 
def cube(y): 
    return y*y*y 
  
lambda_cube = lambda y: y*y*y 
  
# using the normally 
# defined function 
print(cube(5)) 
  
# using the lamda function 
print(lambda_cube(5)) 

출력:

125
125

람다 사용 안 함:

  • 여기서 둘 다 주어진 숫자의 큐브를 돌려준다.그러나, 디프를 사용하는 동안, 우리는 이름 큐브로 함수를 정의해야 했고, 그것에 값을 전달해야 했다.실행 후, 리턴 키워드를 이용하여 기능을 호출한 곳에서 결과를 반환할 필요도 있었다.

람다 사용:

  • 람다 정의는 "반환" 문을 포함하지 않으며, 항상 반환되는 식을 포함한다.함수가 예상되는 곳에 람다 정의도 넣을 수 있고, 변수에 전혀 할당할 필요도 없다.이것이 람다 함수의 단순함이다.

람다 기능은 다음과 같은 내장 기능과 함께 사용할 수 있다.filter(),map()그리고reduce().

필터링을 넣은 람다.

filter()Python의 함수는 함수와 목록을 인수로 받아들인다.이는 기능이 반환되는 시퀀스 "시퀀스"의 모든 요소를 걸러내는 우아한 방법을 제공한다.True.

my_list = [1, 5, 4, 6, 8, 11, 3, 12]

new_list = list(filter(lambda x: (x%2 == 0) , my_list))

print(new_list)


ages = [13, 90, 17, 59, 21, 60, 5]

adults = list(filter(lambda age: age>18, ages)) 
  
print(adults) # above 18 yrs 

출력:

[4, 6, 8, 12]
[90, 59, 21, 60]

maptain을 사용한 람다.

map()Python의 함수는 함수와 목록을 인수로 받아들인다.함수는 람다 함수와 목록으로 호출되며, 각 항목에 대해 해당 함수에 의해 반환된 람다 수정 품목이 모두 포함된 새 목록이 반환된다.

my_list = [1, 5, 4, 6, 8, 11, 3, 12]

new_list = list(map(lambda x: x * 2 , my_list))

print(new_list)


cities = ['novi sad', 'ljubljana', 'london', 'new york', 'paris'] 
  
# change all city names 
# to upper case and return the same 
uppered_cities = list(map(lambda city: str.upper(city), cities)) 
  
print(uppered_cities)

출력:

[2, 10, 8, 12, 16, 22, 6, 24]
['NOVI SAD', 'LJUBLJANA', 'LONDON', 'NEW YORK', 'PARIS']

줄이다

reduce()와 다르게 작용하다map()그리고filter(). 를 기반으로 새 목록을 반환하지 않는다.function그리고 우리가 지나쳤던 수 많은 것들.대신 단일 값을 반환한다.

또한 파이톤 3에서reduce()더 이상 내장된 기능이 아니고, 앞으로 찾을 수 있다.functools모듈

구문은 다음과 같다.

reduce(function, sequence[, initial])

reduce()전화를 걸어 일을 하다.function우리는 처음 두 항목을 순서대로 통과시켰다....에.에 의해 반환된 결과function로의 다른 호출에 사용된다.function다음 요소(이 경우 세 번째)와 함께.

선택적 인수initial존재하는 경우, 첫 번째 통화의 첫 번째 요소와 함께 이 "초기"의 시작에 사용된다.function어떻게 보면.initial원소는 제공될 때 첫 번째 원소 이전의 0번째 원소다.

환원제를 곁들인 람다.

Python의 감소() 함수는 함수와 목록을 인수로 받아들인다.함수는 람다 함수와 함께 호출되며, 반복할 수 있고 새로운 감소된 결과가 반환된다.이것은 반복적인 연산을 반복해서 반복한다.

from functools import reduce

my_list = [1, 1, 2, 3, 5, 8, 13, 21, 34] 

sum = reduce((lambda x, y: x + y), my_list) 

print(sum) # sum of a list
print("With an initial value: " + str(reduce(lambda x, y: x + y, my_list, 100)))
88
With an initial value: 188

이 기능들은 편의 기능이다.그것들은 여러분이 더 번거로운 코드를 쓰지 않도록 하기 위해 그곳에 있지만, 너무 많이 사용하는 것은 피하는데, 왜냐하면 "할 수 있다"는 것은 종종 유지하기가 어려운 읽기 어려운 코드로 이어질 수 있기 때문이다.함수나 람다 표현을 보자마자 무슨 일이 일어나고 있는지 확실히 알 수 있을 때만 사용한다.

참조URL: https://stackoverflow.com/questions/13638898/how-to-use-filter-map-and-reduce-in-python-3

반응형