source

파이썬에서 "필터" 개체의 길이를 찾는 방법

manycodes 2023. 5. 26. 21:13
반응형

파이썬에서 "필터" 개체의 길이를 찾는 방법

>>> n = [1,2,3,4]

>>> filter(lambda x:x>3,n)
<filter object at 0x0000000002FDBBA8>

>>> len(filter(lambda x:x>3,n))
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    len(filter(lambda x:x>3,n))
TypeError: object of type 'filter' has no len()

저는 제가 받은 목록의 길이를 알 수 없었습니다.그래서 변수에 저장하려고 했어요, 이런 식으로...

>>> l = filter(lambda x:x>3,n)
>>> len(l)
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    len(l)
TypeError: object of type 'filter' has no len()

루프를 사용하는 대신에, 이것의 길이를 알 수 있는 방법이 있습니까?

필터 개체를 통해 어떻게든 반복해야 합니다.한 가지 방법은 목록으로 변환하는 것입니다.

l = list(filter(lambda x: x > 3, n))

len(l)  # <--

하지만 그것은 사용의 요점을 좌절시킬 수도 있습니다.filter()우선, 당신은 목록 이해로 이것을 더 쉽게 할 수 있기 때문에:

l = [x for x in n if x > 3]

다시.len(l)길이를 반환합니다.

이것은 오래된 질문이지만, 저는 이 질문이 지도 축소 이념을 이용한 답이 필요하다고 생각합니다.자, 여기 있습니다.

from functools import reduce

def ilen(iterable):
    return reduce(lambda sum, element: sum + 1, iterable, 0)

ilen(filter(lambda x: x > 3, n))

이것은 만약에 특히 좋습니다.n컴퓨터 메모리에 맞지 않습니다.

필터를 목록으로 변환하려면 추가 메모리가 필요하며, 이는 대용량 데이터에서는 허용되지 않을 수 있습니다.의 길이를 찾을 수 있습니다.filter객체를 a로 변환하지 않고 객체list:

sum(1 for _ in filter(lambda x: x > 3, n))

일반적으로.filter그리고.reduce비단뱀이 아닙니다.

@arshaji는 이 해결책을 언급했습니다.

len([x for x in n if x > 3])

이것은 매우 간단하지만 정확히 무엇을 하고 싶은지 설명하지 않으며 추가 메모리를 사용할 수 있는 목록을 만듭니다.더 나은 솔루션은sum제너레이터 포함:

sum(1 for x in n if x > 3)

(여기에서 제너레이터에 대한 자세한 내용을 참조하십시오. https://www.python.org/dev/peps/pep-0289/ #http://) )

하지만,sum대부분의 경우 구현(CPython 3.6.4에서 테스트됨) 때문에 제너레이터를 사용하면 실제로 속도가 느려집니다.

In [1]: %timeit len([1 for x in range(10000000)])
356 ms ± 17.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [2]: %timeit sum(1 for x in range(10000000))
676 ms ± 7.05 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

파이썬 3의 문서에 따르면 반복기를 반환합니다.

"함수가 참으로 반환되는 반복 가능한 요소로 반복기를 구성합니다."

python 2에서는 목록을 반환했습니다. 여기를 참조하십시오.필터 개체의 길이를 확인하려면 필터 개체를 반복해야 합니다.

더 많은 반복적인 도구를 사용하여 해결할 수 있습니다.

from more_itertools import ilen
f = filter(lambda x:x>3,n)
return ilen(f)

참고:ilen필터를 사용합니다(이후에는 사용할 수 없습니다. 빈 목록을 반환합니다).

언급URL : https://stackoverflow.com/questions/19182188/how-to-find-the-length-of-a-filter-object-in-python

반응형