【问题标题】:Get length of True values [duplicate]获取真值的长度[重复]
【发布时间】:2019-05-21 09:21:18
【问题描述】:

做长度会给我元素的数量:

>>> len([False, True, True, False, False])
5

但是,我想获取 True 元素的数量。最好的方法是什么?目前我正在做:

>>> len([item for item in items if item is True])
2

也许有一个内置的,比如:

len(items, val=False)

【问题讨论】:

  • 在没有列表理解的情况下在列表上调用sum()
  • @user2357112 - 拿那个:counting-the-number-of-true-booleans-in-a-python-list - 更好的欺骗
  • @user2357112 支持我错了,但我不同意这个骗局。这只是计算布尔值。
  • @PatrickArtner: sum 速度较慢且不太清晰,所以我认为count 更好。
  • @user2357112 也许您可以添加一个答案,表明在基准测试中计数更快,比较两者?

标签: python python-3.x


【解决方案1】:

您可以简单地 sum() 列表 False 为 0,True 为 1。 其他方式是list.count() True's:

prep = """import random
random.seed("count is faster then sum he said...")
data = random.choices([True,False],k=10000)"""

prog1 = "k = sum(data)"
prog2 = "l = data.count(True)"
prog3 = "j = len( [x for x in data if x] )"

import timeit

print(timeit.timeit(prog1,setup=prep, number = 1000))
print(timeit.timeit(prog2,setup=prep, number = 1000))
print(timeit.timeit(prog3,setup=prep, number = 1000))

输出:

0.32247100600034173  # sum( data )
0.12246353499995166  # data.count( True )  
0.24579112000083114  # len( [x for x in data if x] )

计数似乎是正确的选择,它只需要大约 45-50% 的时间。甚至len( [x for x in data if x] ) 的 list-comp 也比 sum 快。

这两种方法已经在其他问题中介绍过:

【讨论】:

  • 第二个链接似乎影响了很多人:)
  • @Patrick -- 很好的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2018-08-09
  • 1970-01-01
相关资源
最近更新 更多