Самый быстрый способ подсчета количества вхождений в списке Python

у меня есть список в Python, и я хочу знать, какой самый быстрый способ подсчитать количество вхождений элемента '1' в этом списке. В моем фактическом случае элемент может происходить десятки тысяч раз, поэтому я хочу быстрый способ.

['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']

тут collections справка по модулю? Я использую Python 2.7

4 ответов


a = ['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']
print a.count("1")

вероятно, он сильно оптимизирован на уровне C.

Edit: я случайно сгенерировал большой список.

In [8]: len(a)
Out[8]: 6339347

In [9]: %timeit a.count("1")
10 loops, best of 3: 86.4 ms per loop

Edit edit: это можно сделать с помощью сборники.Счетчик

a = Counter(your_list)
print a['1']

используя тот же список в моем последнем примере времени

In [17]: %timeit Counter(a)['1']
1 loops, best of 3: 1.52 s per loop

мое время упрощенно и зависит от многих различных факторов, но это дает вам хороший ключ к производительности.

вот некоторые профайлинг

In [24]: profile.run("a.count('1')")
         3 function calls in 0.091 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.091    0.091 <string>:1(<module>)
        1    0.091    0.091    0.091    0.091 {method 'count' of 'list' objects}

        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Prof
iler' objects}



In [25]: profile.run("b = Counter(a); b['1']")
         6339356 function calls in 2.143 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    2.143    2.143 <string>:1(<module>)
        2    0.000    0.000    0.000    0.000 _weakrefset.py:68(__contains__)
        1    0.000    0.000    0.000    0.000 abc.py:128(__instancecheck__)
        1    0.000    0.000    2.143    2.143 collections.py:407(__init__)
        1    1.788    1.788    2.143    2.143 collections.py:470(update)
        1    0.000    0.000    0.000    0.000 {getattr}
        1    0.000    0.000    0.000    0.000 {isinstance}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Prof
iler' objects}
  6339347    0.356    0.000    0.356    0.000 {method 'get' of 'dict' objects}

С помощью счетчик словарь подсчета вхождений всех элементов, а также наиболее распространенных элементов в списке python со значением вхождения наиболее эффективным способом.

если наш список python: -

l=['1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '7', '7', '7', '10', '10']

чтобы найти вхождение каждого элемента в списке python, используйте следующее: -

\>>from collections import Counter

\>>c=Counter(l)

\>>print c

Counter({'1': 6, '2': 4, '7': 3, '10': 2})

чтобы найти большинство / наибольшее появление элементов в списке python: -

\>>k=c.most_common()

\>>k

[('1', 6), ('2', 4), ('7', 3), ('10', 2)]

Для Самых Высоких один:-

\>>k[0][1]

6

для элемента просто используйте k[0] [0]

\>>k[0][0]

'1'

для n-го высшего элемента и его отсутствие в списке используйте следующее: -

* * для n=2**

\>>print k[n-1][0] # For item

2

\>>print k[n-1][1] # For value

4

комбинация лямбда и функции карты также может выполнять эту работу:

list_ = ['a', 'b', 'b', 'c']
sum(map(lambda x: x=="b", list_))
:2

вы можете преобразовать список в строку с элементами, разделенными пробелом, и разделить его на основе числа/символа для поиска..

будет чистым и быстрым для большого списка..

>>>L = [2,1,1,2,1,3]
>>>strL = " ".join(str(x) for x in L)
>>>strL
2 1 1 2 1 3
>>>count=len(strL.split(" 1"))-1
>>>count
3