source

Python 목록의 True Bohan 수 계산

ittop 2023. 4. 12. 22:58
반응형

Python 목록의 True Bohan 수 계산

나는 Bohan의 목록을 가지고 있다.

[True, True, False, False, False, True]

그 수를 세는 방법을 찾고 있어요True(위의 예에서, 나는 수익률을3특정 요소의 발생 횟수를 찾는 예를 찾았습니다만, Bohans와 협력하고 있기 때문에 보다 효율적인 방법이 있을까요?나는 비슷한 것을 생각하고 있다.all또는any.

True와 동등하다1.

>>> sum([True, True, False, False, False, True])
3

list에는 다음 방법이 있습니다.

>>> [True,True,False].count(True)
2

이것은, 실제로는, 보다 효율적입니다.sum의도에 대해 좀 더 명확하게 말할 뿐만 아니라,sum:

In [1]: import random

In [2]: x = [random.choice([True, False]) for i in range(100)]

In [3]: %timeit x.count(True)
970 ns ± 41.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [4]: %timeit sum(x)
1.72 µs ± 161 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

상수에만 관심이 있는 경우True, 심플sum괜찮아요.그러나 Python에서는 다른 값이 다음과 같이 평가된다는 점에 유의하십시오.True뿐만 아니라.보다 견고한 솔루션은 다음과 같습니다.bool내장:

>>> l = [1, 2, True, False]
>>> sum(bool(x) for x in l)
3

업데이트: 투명성이 뛰어난 또 다른 강력한 솔루션을 소개합니다.

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

P.S. Python trivia:True 1이 아니더라도 사실일 수 있습니다.경고: 직장에서 시도하지 마십시오!

>>> True = 2
>>> if True: print('true')
... 
true
>>> l = [True, True, False, True]
>>> sum(l)
6
>>> sum(bool(x) for x in l)
3
>>> sum(1 for x in l if x)
3

훨씬 더 나쁜 것:

True = False

사용할 수 있습니다.sum():

>>> sum([True, True, False, False, False, True])
3

이 질문에 대한 모든 답과 댓글을 읽고, 나는 작은 실험을 해볼까 생각했다.

무작위로 5만개의 불란을 생성하고sum그리고.count그 위에 올려놔요.

결과는 다음과 같습니다.

>>> a = [bool(random.getrandbits(1)) for x in range(50000)]
>>> len(a)
50000
>>> a.count(False)
24884
>>> a.count(True)
25116
>>> def count_it(a):
...   curr = time.time()
...   counting = a.count(True)
...   print("Count it = " + str(time.time() - curr))
...   return counting
... 
>>> def sum_it(a):
...   curr = time.time()
...   counting = sum(a)
...   print("Sum it = " + str(time.time() - curr))
...   return counting
... 
>>> count_it(a)
Count it = 0.00121307373046875
25015
>>> sum_it(a)
Sum it = 0.004102230072021484
25015

만약을 위해 몇 번 더 반복했습니다.

>>> count_it(a)
Count it = 0.0013530254364013672
25015
>>> count_it(a)
Count it = 0.0014507770538330078
25015
>>> count_it(a)
Count it = 0.0013344287872314453
25015
>>> sum_it(a)
Sum it = 0.003480195999145508
25015
>>> sum_it(a)
Sum it = 0.0035257339477539062
25015
>>> sum_it(a)
Sum it = 0.003350496292114258
25015
>>> sum_it(a)
Sum it = 0.003744363784790039
25015

보시다시피count보다 3배 빠르다sum그래서 저는 이 제품을count에서처럼count_it.

Python 버전: 3.6.7
CPU 코어: 4
RAM 크기: 16 GB
OS: Ubuntu 18.04.1 LTS

완전성을 위해서(sum일반적으로 선호된다)를 언급하고 싶습니다.filter진부한 값을 얻을 수 있습니다.평소 같으면filter함수를 첫 번째 인수로 받아들이지만, 이 인수를 통과하면None모든 "고통" 값을 필터링합니다.이 기능은 다소 놀랍지만 문서화되어 있으며 Python 2와 3 모두에서 작동합니다.

버전 간의 차이점은 파이썬 2의 버전입니다.filter목록을 반환하기 때문에len:

>>> bool_list = [True, True, False, False, False, True]
>>> filter(None, bool_list)
[True, True, True]
>>> len(filter(None, bool_list))
3

하지만 파이썬3에서는filter반복기를 반환하므로 사용할 수 없습니다.len를 사용하지 않고 싶은 경우sum(어떤 이유로든) 반복기를 목록으로 변환해야 합니다(이것이 훨씬 더 예쁘지 않습니다).

>>> bool_list = [True, True, False, False, False, True]
>>> filter(None, bool_list)
<builtins.filter at 0x7f64feba5710>
>>> list(filter(None, bool_list))
[True, True, True]
>>> len(list(filter(None, bool_list)))
3

도망치는 것이 안전합니다.bool첫 번째, 이것은 쉽게 할 수 있습니다.

>>> sum(map(bool,[True, True, False, False, False, True]))
3

그런 다음 Python이 True 또는 False로 간주하는 모든 것을 적절한 버킷으로 가져옵니다.

>>> allTrue=[True, not False, True+1,'0', ' ', 1, [0], {0:0}, set([0])]
>>> list(map(bool,allTrue))
[True, True, True, True, True, True, True, True, True]

필요에 따라서, 다음의 설명을 사용할 수 있습니다.

>>> allFalse=['',[],{},False,0,set(),(), not True, True-1]
>>> [bool(i) for i in allFalse]
[False, False, False, False, False, False, False, False, False]

는 는는더 prefer prefer ilen([b for b in boollist if b is True])(또는 발전기-전압 등가물) 꽤 자기 조절적이기 때문입니다.이그나시오 바스케스 에이브람스

이 할 수 있습니다.이 방법에서는 가능하다고 하지만 True: about no altern altern 、 음 、 음 、 음 、 음 、 음 、 , 、 , 、 , 、 , , , 。이것은 여전히 bool이 int로 변환 가능하다고 가정하지만 True의 값에 대해서는 가정하지 않습니다.ntrue = sum(boollist) / int(True)

언급URL : https://stackoverflow.com/questions/12765833/counting-the-number-of-true-booleans-in-a-python-list

반응형