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
'source' 카테고리의 다른 글
WPF MVVM 탐색 뷰 (0) | 2023.04.12 |
---|---|
Objective-C의 자동 기준 계수가 방지하거나 최소화하지 못하는 누출의 종류는 무엇입니까? (0) | 2023.04.12 |
Excel VBA 함수 결과 새로 고침 (0) | 2023.04.12 |
SQL Server 문자열과 Null 연결 (0) | 2023.04.12 |
Bash 스크립트 오류 [: !=: 단항 연산자가 필요합니다. (0) | 2023.04.12 |