2014-12-26 11 views
2

파이썬에서 lambda를 사용하는 방법에 대한 자습서는 this입니다. 세 번째 예제를 시도 할 때 결과가 튜토리얼과 같지 않음을 발견했습니다. 나는 내 코드가 정확하다는 것을 99 % 확신하지만, 그럼에도 불구하고 여기에있다.필터 기능 내의 람다?

my_list = [2,9,10,15,21,30,33,45] 

my_new_list = filter(lambda x: x % 3 == 0, my_list) 
print(my_new_list) 

이것의 결과는 : 나는 파이썬 3.4.2

  • 파이썬 2.7.2 잘 작동을 사용하고 사용하고

    • : 명심해야 할 <filter object at 0x004F39F0>

      것들 반환 [9, 15, 21, 30, 33, 45]

    나는 이해합니다. 단순히 Python 3.4+에서는 작동하지 않습니다. 나는 그것이 왜 효과가 없으며 또한 람다의 존재 여부에 관계없이 이것을하는 평등 한 방법을 찾고있는 것에 대해 더욱 궁금합니다.

  • 답변

    8

    차이점은 filter이 파이썬 3.x에서 iterator을 반환한다는 것입니다. 그래서, 당신은 수동으로 목록을하기 위해 거기에 list()를 호출해야합니다

    >>> my_list = [2,9,10,15,21,30,33,45] 
    >>> filter(lambda x: x % 3 == 0, my_list) 
    <filter object at 0x01ACAB50> 
    >>> list(filter(lambda x: x % 3 == 0, my_list)) 
    [9, 15, 21, 30, 33, 45] 
    >>> 
    

    같은도 반복자를 반환하는 파이썬 3.x를 변경되었습니다 map, 간다. 현재 이러한 변화를 읽을 수 있습니다 말했다 https://docs.python.org/3/whatsnew/3.0.html#views-and-iterators-instead-of-lists


    , filtermap은 일반적으로 파이썬 프로그래머 싫어한다. 특히 lambda을 사용해야하는 경우 특히 그렇습니다. 이 경우 (그리고 거의 모든 다른 사람)에있는 더 좋은 방법은 사용하는 것 list comprehension : 파이썬 3에서, 필터 함수는 반복자를 반환하기 때문에

    my_list = [2,9,10,15,21,30,33,45] 
    
    my_new_list = [x for x in my_list if x % 3 == 0] 
    print(my_new_list) 
    
    +0

    위대한 답변! 설명해 주셔서 감사합니다. 또한 내가 선호하는 대안을 제시해 주셔서 감사합니다. –

    4

    그것입니다. 모든 결과를 얻으려면 list(my_new_list)을 사용하십시오. 분명히 말하자면, filter은 "작동하지 않습니다"가 아니라, 2.x에 비해 Python 3.x에서 동작이 다르다는 것입니다.

    이전 대답은 How to use filter, map, and reduce in Python 3을 참조하십시오.

    큰 목록이있는 경우 모든 요소를 ​​즉시 처리하는 것이 바람직하지 않을 수 있습니다. 생성기는 결과의 일부만 사용하는 경우 (예 : 필터링 된 목록을 반복하는 경우)에 메모리를 절약 할 수 있도록 요구시 결과를 생성합니다.