簡體   English   中英

如何計算列表中特定類型的出現次數?

[英]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

我知道有一些解決方法(使用循環等),但我想知道是否有像只使用一個函數(如計數函數等)一樣簡單的東西。

import operator
operator.countOf(map(type, ex_list), int)

在線試試吧!

文檔

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM