2013-03-07 2 views
2

У меня есть следующий список номеров:Подсчет количества вхождений

l = [2L, 14L, 14L, 14L, 11L, 2L, 2L, 11L, 14L, 11L, 14L, 2L, 2L, 14L, ...] 

Как бы я выяснить количество вхождений числа (например, 2) или несколько номеров (например, 2 или 5 или 7)?

То, как я собирался это сделать, был с циклом for, но я уверен, что есть более эффективный способ.

ответ

5

collections.Counter делает словарь, который отображает значения, сколько раз они происходят:

>>> from collections import Counter 
>>> l = [2L, 14L, 14L, 14L, 11L, 2L, 2L, 11L, 14L, 11L, 14L, 2L, 2L, 14L] 
>>> c = Counter(l) 
>>> c 
    Counter({14L: 6, 2L: 5, 11L: 3}) 
>>> c[14L] 
    6 
5
>>> l.count(2) 
5 

Простой, как пирог. Если у вас есть список номеров, на которые вы хотели бы найти отсчеты можно попробовать, например:

>>> {n: l.count(n) for n in [2, 5, 7]} 
{2: 5, 5: 0, 7: 0} 

Если вы хотите рассчитывает на все элементы, я бы предложил collections.Counter, как уже упоминалось в другой ответ ,

+1

+ 1 Ударь меня! – squiguy

+0

Это будет неэффективно, если список огромен. –

1

Collections.Counter был введен в py2.7, поэтому для Py 2.6 и выше, вы можете попробовать что-то вроде этого:

In [1]: l = [2L, 14L, 14L, 14L, 11L, 2L, 2L, 11L, 14L, 11L, 14L, 2L, 2L, 14L] 

In [2]: dic={} 

In [3]: for x in l: 
    ...:  dic[x]=dic.get(x,0)+1 
    ...:  

In [4]: dic 
Out[4]: {2L: 5, 11L: 3, 14L: 6} 

или использовать defaultdict (введен в py2.5):

In [6]: from collections import defaultdict 

In [7]: dic=defaultdict(int) 

In [8]: for x in l: 
    dic[x]+=1 
    ...:  

In [9]: dic 
Out[9]: defaultdict(<type 'int'>, {2L: 5, 11L: 3, 14L: 6}) 
Смежные вопросы