在Python列表中计算某种对象类型的数量
如果我在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
的方法都会把 True
或 False
当作整数来计算,因为布尔值(bool)是整数(int)的一个子类:
>>> isinstance(False, int)
True
>>> type(False)==int
False
所以如果你需要区分 int
和 bool
,可以用 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
这个会返回