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解释False为0,反之亦然.据我所知,甚至None和""可以考虑False在条件.重新定义计数如下:
sum(1 for item in a if item == 0 and type(item) == int)
Run Code Online (Sandbox Code Playgroud)
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运营商的文档:
对象标识的运算符
is和is not测试:x is y当且仅当x和y是同一个对象时才为真.
有关is运算符的更多信息:了解Python的"is"运算符
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)
你需要自己过滤掉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)
这个功能样式解决方案怎么样:
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)