[英]How to count occurrences of specific type in a list?
有沒有一種簡單的方法來計算列表中有多少特定類型的元素?
這就是我的想法和我嘗試過的。
ex_list = ["string", "data", "item", 1, 3, {3: "im dict"}, "im_item"]
print(ex_list.count(int)) # -> 0, should return 2
print(ex_list.count(type(str))) # -> 0, should return 4
我知道有一些解決方法(使用循環等),但我想知道是否有像只使用一個函數(如計數函數等)一樣簡單的東西。
您可以使用Counter
類(來自collections
)與類型的映射:
from collections import Counter
ex_list = ["string", "data", "item", 1, 3, {3: "im dict"}, "im_item"]
typeCounts = Counter(map(type,ex_list))
>>> typeCounts
Counter({<class 'str'>: 4, <class 'int'>: 2, <class 'dict'>: 1})
>>> typeCounts[int]
2
這將在 O(n) 時間內進行初始計數,此后每次使用typeCounts[type]
都將是 O(1)。
我不會將循環稱為解決方法; 對此的任何解決方案都將使用循環,無論它是用 Python 編寫的還是在后台編寫的。 所以,這是一個使用isinstance()
的循環解決方案,它允許子類。
def type_count(iterable, type_):
return sum(isinstance(x, type_) for x in iterable)
>>> type_count(ex_list, int)
2
>>> type_count(ex_list, str)
4
如果您想使用Counter
解決方案但允許子類,您可以通過每種類型的方法解析順序(MRO),如下所示:
from collections import Counter
typeCounts = Counter(map(type, ex_list))
for t, n in list(typeCounts.items()): # list() since the dict will change size
for parent in t.__mro__[1:]:
typeCounts[parent] += n
>>> typeCounts[int]
2
>>> typeCounts[object] == len(ex_list)
True
文檔: class.__mro__
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.