我什么时候应该使用list.count(0),如何打折"False"项?

Ton*_*ang 19 python boolean list count

a.count(0)总是返回11,那么我应该怎么做才能打折False并返回10?

a = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]
Run Code Online (Sandbox Code Playgroud)

Ahm*_*shi 12

Python 2.x解释False0,反之亦然.据我所知,甚至None""可以考虑False在条件.重新定义计数如下:

sum(1 for item in a if item == 0 and type(item) == int)
Run Code Online (Sandbox Code Playgroud)

或者(感谢KevinBakuriu的评论):

sum(1 for item in a if item == 0 and type(item) is type(0))
Run Code Online (Sandbox Code Playgroud)

或者正如ozgur在评论中所建议的那样(不推荐也被认为是错误的,请参阅此内容),简单地说:

sum(1 for item in a if item is 0)  
Run Code Online (Sandbox Code Playgroud)

可能("是"运算符与整数一起意外运行)适用于小型主要类型,但如果列表包含对象,请考虑is运算符的作用:

is运营商的文档:

对象标识的运算符isis not测试:x is y当且仅当x和y是同一个对象时才为真.

有关is运算符的更多信息:了解Python的"is"运算符

  • 不不不.**永远不要做`如果x是0`(或任何整数而不是0).它可能碰巧工作,但这是一个实现细节(小整数实习),甚至不适用于更大的数字.一致的实现完全可以自由地创建多个不同的零对象,并且对于"0为0"返回false.检查这个的正确方法是`x == 0和type(x)是int`(请注意,只有一个`int`类,所以在这里使用`is`是安全的). (8认同)
  • @Kevin嗯,你总是可以做`int = bool`.如果你想要一个1000%工作的解决方案`type(x)是type(0)`有效,因为没有办法改变整数文字的类型.此外,您可以使用元组比较简化整个事物:`list(map(lambda x:(x,type(x)),sequence).count((0,type(0)))`. (3认同)

Ara*_*Fey 11

你可以使用sum和生成器表达式:

>>> a = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]
>>> sum((x == 0 and x is not False) for x in a)
10
Run Code Online (Sandbox Code Playgroud)


Sev*_*eri 8

你需要自己过滤掉Falses.

>>> a = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]
>>> len([x for x in a if x == 0 and x is not False])
10
Run Code Online (Sandbox Code Playgroud)

旧答案是CPython特有的,最好使用适用于所有Python实现的解决方案.

由于CPython 保留了一个包含零的小整数对象池,因此您可以使用is运算符过滤列表.

这当然不应该用于价值比较,但在这种情况下,它起作用,因为零是我们想要找到的.

>>> a = ["a",0,0,"b",None,"c","d",0,1,False,0,1,0,3,[],0,1,9,0,0,{},0,0,9]
>>> [x for x in a if x is 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> len(_)
10
Run Code Online (Sandbox Code Playgroud)

  • 依赖CPython的内部优化细节是一个坏主意,特别是当编写不依赖它们的代码时很容易. (5认同)
  • 更具体地说,_CPython_保留了一个小池.我不相信这样做需要符合要求的python实现. (3认同)
  • 小话:`过滤器(lambda`几乎总是反模式.在大多数情况下,理解效果更快,lambda太重了 (2认同)

kez*_*zos 6

这个功能样式解决方案怎么样:

print zip(a, map(type, a)).count((0, int))
>>> 10
Run Code Online (Sandbox Code Playgroud)

针对这里的其他一些答案,这也似乎是最快的一个:

t0 = time.time()
for i in range(100000):
    zip(a, map(type, a)).count((0, int))
print time.time() - t0
>>> 0.275855064392

t0 = time.time()
for i in range(100000):
    sum(1 for item in a if item == 0 and type(item) == int)
print time.time() - t0
>>> 0.478030204773

t0 = time.time()
for i in range(100000):
    sum(1 for item in a if item == 0 and type(item) is type(0))
print time.time() - t0
>>> 0.52236700058

t0 = time.time()
for i in range(100000):
    sum((x==0 and x is not False) for x in a)
print time.time() - t0
>>> 0.450266122818
Run Code Online (Sandbox Code Playgroud)