log - python plot histogram




如何統計列表項的出現次數? (12)

給定一個項目,我如何計算它在Python中的列表中的出現次數?


給定一個項目,我如何計算它在Python中的列表中的出現次數?

以下是一個示例列表:

>>> l = list('aaaaabbbbcccdde')
>>> l
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'e']

list.count

list.count方法

>>> l.count('b')
4

這適用於任何列表。 元組也有這種方法:

>>> t = tuple('aabbbffffff')
>>> t
('a', 'a', 'b', 'b', 'b', 'f', 'f', 'f', 'f', 'f', 'f')
>>> t.count('f')
6

collections.Counter

然後有收藏品。計數器。 您可以將任何迭代器轉儲到Counter中,而不僅僅是一個列表,Counter將保留一個元素計數的數據結構。

用法:

>>> from collections import Counter
>>> c = Counter(l)
>>> c['b']
4

計數器基於Python字典,它們的鍵是元素,所以鍵需要可排除。 它們基本上就像允許冗餘元素進入它們的集合。

進一步使用collections.Counter

你可以在計數器中添加或減去迭代次數:

>>> c.update(list('bbb'))
>>> c['b']
7
>>> c.subtract(list('bbb'))
>>> c['b']
4

你也可以用計數器進行多套操作:

>>> c2 = Counter(list('aabbxyz'))
>>> c - c2                   # set difference
Counter({'a': 3, 'c': 3, 'b': 2, 'd': 2, 'e': 1})
>>> c + c2                   # addition of all elements
Counter({'a': 7, 'b': 6, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1})
>>> c | c2                   # set union
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1})
>>> c & c2                   # set intersection
Counter({'a': 2, 'b': 2})

為什麼不是熊貓?

另一個答案表明:

為什麼不使用熊貓?

熊貓是一個普通的圖書館,但它不在標準圖書館。 將它作為依賴項添加並不重要。

在列表對象本身以及標準庫中都有這種用例的內置解決方案。

如果您的項目不需要熊貓,將其作為僅用於此功能的要求將是愚蠢的。



可能不是最高效的,需要額外的通行證才能刪除重複項。

功能實現:

arr = np.array(['a','a','b','b','b','c'])
print(set(map(lambda x  : (x , list(arr).count(x)) , arr)))

返回:

{('c', 1), ('b', 3), ('a', 2)}

或者返回dict

print(dict(map(lambda x  : (x , list(arr).count(x)) , arr)))

返回:

{'b': 3, 'c': 1, 'a': 2}

在字典中獲取每個項目出現次數的另一種方法:

dict((i, a.count(i)) for i in a)

如果你想立刻計算所有的值,你可以使用numpy數組和bincount非常快bincount按照如下步驟進行

import numpy as np
a = np.array([1, 2, 3, 4, 1, 4, 1])
np.bincount(a)

這使

>>> array([0, 3, 1, 1, 2])

如果您使用的是Python 2.7或3,並且您希望每個元素的出現次數為:

>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> Counter(z)
Counter({'blue': 3, 'red': 2, 'yellow': 1})

我今天遇到了這個問題,並在我想檢查SO之前推出了自己的解決方案。 這個:

dict((i,a.count(i)) for i in a)

大列表真的很慢。 我的解決方案

def occurDict(items):
    d = {}
    for i in items:
        if i in d:
            d[i] = d[i]+1
        else:
            d[i] = 1
return d

實際上比Counter解決方案快一點,至少對於Python 2.7來說。


我將所有建議的解決方案(以及一些新的解決方案)與perfplot (我的一個小項目)進行了比較。

計數一個項目

對於足夠大的陣列,事實證明

numpy.sum(numpy.array(a) == 1) 

比其他解決方案稍快。

計數所有項目

如前所述 ,

numpy.bincount(a)

是你想要的。

代碼重現的情節:

from collections import Counter
from collections import defaultdict
import numpy
import operator
import pandas
import perfplot


def counter(a):
    return Counter(a)


def count(a):
    return dict((i, a.count(i)) for i in set(a))


def bincount(a):
    return numpy.bincount(a)


def pandas_value_counts(a):
    return pandas.Series(a).value_counts()


def occur_dict(a):
    d = {}
    for i in a:
        if i in d:
            d[i] = d[i]+1
        else:
            d[i] = 1
    return d


def count_unsorted_list_items(items):
    counts = defaultdict(int)
    for item in items:
        counts[item] += 1
    return dict(counts)


def operator_countof(a):
    return dict((i, operator.countOf(a, i)) for i in set(a))


perfplot.show(
    setup=lambda n: list(numpy.random.randint(0, 100, n)),
    n_range=[2**k for k in range(20)],
    kernels=[
        counter, count, bincount, pandas_value_counts, occur_dict,
        count_unsorted_list_items, operator_countof
        ],
    equality_check=None,
    logx=True,
    logy=True,
    )

2。

from collections import Counter
from collections import defaultdict
import numpy
import operator
import pandas
import perfplot


def counter(a):
    return Counter(a)


def count(a):
    return dict((i, a.count(i)) for i in set(a))


def bincount(a):
    return numpy.bincount(a)


def pandas_value_counts(a):
    return pandas.Series(a).value_counts()


def occur_dict(a):
    d = {}
    for i in a:
        if i in d:
            d[i] = d[i]+1
        else:
            d[i] = 1
    return d


def count_unsorted_list_items(items):
    counts = defaultdict(int)
    for item in items:
        counts[item] += 1
    return dict(counts)


def operator_countof(a):
    return dict((i, operator.countOf(a, i)) for i in set(a))


perfplot.show(
    setup=lambda n: list(numpy.random.randint(0, 100, n)),
    n_range=[2**k for k in range(20)],
    kernels=[
        counter, count, bincount, pandas_value_counts, occur_dict,
        count_unsorted_list_items, operator_countof
        ],
    equality_check=None,
    logx=True,
    logy=True,
    )

要計算具有通用類型的不同元素的數量:

li = ['A0','c5','A8','A2','A5','c2','A3','A9']

print sum(1 for el in li if el[0]=='A' and el[1] in '01234')

3 ,而不是6


如果您只需要一個項目的計數,請使用count方法:

>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3

如果要計算多個項目,請不要使用此項。 在循環中調用count需要在每次count調用時對列表進行單獨傳遞,這可能對性能造成災難性影響。 如果要計算所有項目,或者甚至只計算多個項目,請使用Counter ,如其他答案中所述。


from collections import Counter
country=['Uruguay', 'Mexico', 'Uruguay', 'France', 'Mexico']
count_country = Counter(country)
output_list= [] 

for i in count_country:
    output_list.append([i,count_country[i]])
print output_list

輸出列表:

[['Mexico', 2], ['France', 1], ['Uruguay', 2]]

sum([1 for elem in <yourlist> if elem==<your_value>])

這將返回your_value的出現次數





count