计算列表Python中有多少对象类型

时间:2014-08-18 02:47:30

标签: python list object-type

如果我在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))

希望我清楚自己。

5 个答案:

答案 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的任何方法都会将TrueFalse计为int,因为bool是int的子类:

>>> isinstance(False, int)
True
>>> type(False)==int
False

因此,如果intbool之间的区别很重要,请改用type(whatever)==int