如果我在python中有一个列表:
a = [1, 1.23, 'abc', 'ABC', 6.45, 2, 3, 4, 4.98]
是否有一种非常简单的方法来计算a
中对象类型的数量?
比以下更简单但产生相同结果的东西:
l = [i for i in a if type(a[i]) == int]
print(len(l))
希望我清楚自己。
答案 0 :(得分:10)
使用isinstance
进行类型检查,然后sum
布尔值得到计数(True
为1,False
为0):
sum(isinstance(x, int) for x in a)
答案 1 :(得分:6)
有很多方法可以做到。
这是一个利用列表快速map()函数和C-speed list.count()方法使用它们的方法:
>>> a = [1, 1.23, 'abc', 'ABC', 6.45, 2, 3, 4, 4.98]
>>> map(type, a).count(int)
4
在Python 3中, map()返回一个迭代器,因此您需要进行一些小修改list(map(type, a)).count(int)
。
使用 sum()和 Counter()的其他方法也合理(可读和按预期使用)但速度稍慢。
答案 2 :(得分:2)
a = [1, 1.23, 'abc', 'ABC', 6.45, 2, 3, 4, 4.98]
sum(isinstance(i, int) for i in a)
返回
4
答案 3 :(得分:1)
使用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
如果您想计算特定类型的所有类型和子类型,这对您没有帮助。例如,basestring
类型未出现在结果中,我无法使用上述代码对其进行计数。
答案 4 :(得分:0)
另一种方式:
>>> a = [1, 1.23, 'abc', 'ABC', 6.45, 2, 3, 4, 4.98]
>>> len(filter(lambda e: isinstance(e, int), a))
4
您应该知道使用isinstance
的任何方法都会将True
或False
计为int,因为bool是int的子类:
>>> isinstance(False, int)
True
>>> type(False)==int
False
因此,如果int
和bool
之间的区别很重要,请改用type(whatever)==int
。