如果我在python中有一个列表:
a = [1, 1.23, 'abc', 'ABC', 6.45, 2, 3, 4, 4.98]
Run Code Online (Sandbox Code Playgroud)
是否有一种非常简单的方法来计算对象类型的数量a?比以下更简单的东西但产生相同的结果:
l = [i for i in a if type(a[i]) == int]
print(len(l))
Run Code Online (Sandbox Code Playgroud)
希望我清楚自己.
Blc*_*ght 10
用于isinstance进行类型检查,然后sum使用布尔值来获取计数(True为1,False为0):
sum(isinstance(x, int) for x in a)
Run Code Online (Sandbox Code Playgroud)
有很多方法可以做到这一点.
这是一个利用list fast map()函数和C-speed list.count()方法的方法,它们都是按照预期使用它们:
>>> a = [1, 1.23, 'abc', 'ABC', 6.45, 2, 3, 4, 4.98]
>>> map(type, a).count(int)
4
Run Code Online (Sandbox Code Playgroud)
在Python 3中,map()返回一个迭代器,因此您需要进行一些小的修改list(map(type, a)).count(int).
使用sum()和Counter()的其他方法也是合理的(可读和按预期使用)但速度稍慢.
使用Counter!
from collections import Counter
type_counts = Counter(type(x) for x in a)
assert type_counts[int] == 4
assert type_counts[float] == 3
assert type_counts[str] == 2
Run Code Online (Sandbox Code Playgroud)
如果您想计算特定类型的所有类型和子类型,这对您没有帮助。例如,该basestring类型没有出现在结果中,我无法使用上面的代码来对其进行计数。
a = [1, 1.23, 'abc', 'ABC', 6.45, 2, 3, 4, 4.98]
sum(isinstance(i, int) for i in a)
Run Code Online (Sandbox Code Playgroud)
返回
4
Run Code Online (Sandbox Code Playgroud)