在Python列表中计算某种对象类型的数量

8 投票
5 回答
12021 浏览
提问于 2025-04-18 17:37

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

还有一种方法:

>>> a = [1, 1.23, 'abc', 'ABC', 6.45, 2, 3, 4, 4.98]
>>> len(filter(lambda e: isinstance(e, int), a))
4

你需要知道,任何使用 isinstance 的方法都会把 TrueFalse 当作整数来计算,因为布尔值(bool)是整数(int)的一个子类:

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

所以如果你需要区分 intbool,可以用 type(whatever)==int 来判断。

6

使用 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 这种类型在结果中不会出现,我也不能用上面的代码来统计它。

10

有很多方法可以做到这一点。

这里有一种方法,它利用了列表的快速 map() 函数和 C 语言速度的 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() 的方法也很合理(可读性好,并且是按预期使用的),但速度稍微慢一些。

13

使用 isinstance 来检查数据的类型,然后用 sum 把布尔值加起来,这样就能得到数量(True 代表 1,False 代表 0):

sum(isinstance(x, int) for x in a)
5
a = [1, 1.23, 'abc', 'ABC', 6.45, 2, 3, 4, 4.98]

sum(isinstance(i, int) for i in a)
4

这个会返回

撰写回答