W przypadku danego elementu, jak mogę policzyć jego wystąpienia na liście w Pythonie?
1529
Jeśli chcesz policzyć tylko jeden przedmiot, użyj count
metody:
>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3
Nie używaj tego, jeśli chcesz policzyć wiele przedmiotów. Wywołanie count
w pętli wymaga osobnego przejścia przez listę dla każdego count
połączenia, co może mieć katastrofalny wpływ na wydajność. Jeśli chcesz policzyć wszystkie elementy, a nawet tylko kilka elementów, użyj Counter
, jak wyjaśniono w innych odpowiedziach.
mylist = [1,7,7,7,3,9,9,9,7,9,10,0] print sorted(set([i for i in mylist if mylist.count(i)>2]))
Użyj,
Counter
jeśli używasz języka Python 2.7 lub 3.x i chcesz liczbę wystąpień każdego elementu:źródło
isinstance
. Jeśli więc masz pewność co do danych, z którymi pracujesz, może być lepiej napisać niestandardową funkcję bez sprawdzania typu i instancji.isinstance
połączenia? Nawet w przypadku milionów ciągów wywołanieCounter
obejmuje tylko jednoisinstance
wywołanie, aby sprawdzić, czy jego argumentem jest odwzorowanie. Najprawdopodobniej źle oceniłeś, co jesz przez cały czas.Counter
polegały na liczeniu dużych iteracji, a nie liczeniu wielu iteracji. Liczenie milionowej iterowalnej iteracji pójdzie szybciejCounter
niż przy ręcznej implementacji. Jeśli chcesz zadzwonićupdate
z wieloma iteratorami, możesz być w stanie przyspieszyć, łącząc je w jeden iterowalny zitertools.chain
.Zliczanie wystąpień jednego elementu na liście
Do zliczania wystąpień tylko jednego elementu listy można użyć
count()
Liczenie wystąpień wszystkich elementów na liście jest również znane jako „liczenie” listy lub tworzenie licznika liczb.
Zliczanie wszystkich elementów za pomocą count ()
Aby policzyć występowanie elementów w
l
jednym, wystarczy po prostu skorzystać ze zrozumienia listy icount()
metody(lub podobnie ze słownikiem
dict((x,l.count(x)) for x in set(l))
)Przykład:
Liczenie wszystkich elementów za pomocą Counter ()
Alternatywnie istnieje szybsza
Counter
klasa zcollections
bibliotekiPrzykład:
O ile szybciej działa Counter?
Sprawdziłem, o ile szybsze
Counter
jest tworzenie list liczników. Wypróbowałem obie metody z kilkoma wartościamin
i wydaje się, żeCounter
jest to szybsze o stały współczynnik około 2.Oto skrypt, którego użyłem:
A wynik:
źródło
Counter
jest znacznie szybszy dla większych list. Metodą rozumienia listy jest O (n ^ 2),Counter
powinna być O (n).isinstance
. Jeśli więc masz pewność co do danych, z którymi pracujesz, może być lepiej napisać niestandardową funkcję bez sprawdzania typu i instancji.Inny sposób na uzyskanie liczby wystąpień każdego elementu w słowniku:
źródło
n * (number of different items)
operacje, nie licząc czasu potrzebnego na zbudowanie zestawu. Korzystaniecollections.Counter
jest naprawdę dużo lepsze.i
, ponieważ spróbuje wprowadzić wiele kluczy o tej samej wartości w słowniku.dict((i, a.count(i)) for i in a)
list.count(x)
zwraca liczbę pojawieńx
się na liściepatrz: http://docs.python.org/tutorial/datastructures.html#more-on-lists
źródło
Oto przykładowa lista:
list.count
Jest
list.count
metodaDziała to dobrze dla każdej listy. Krotki mają również tę metodę:
collections.Counter
A potem są kolekcje. Licznik. Możesz zrzucić dowolny iterowalny licznik, a nie tylko listę, a licznik zachowa strukturę danych zliczeń elementów.
Stosowanie:
Liczniki oparte są na słownikach Pythona, ich klucze są elementami, więc klucze muszą być możliwe do skrócenia. Zasadniczo są to zestawy, które pozwalają na nadmiarowe elementy.
Dalsze wykorzystanie
collections.Counter
Możesz dodać lub odjąć za pomocą iteracji z twojego licznika:
Możesz także wykonywać operacje na wielu ustawieniach za pomocą licznika:
Dlaczego nie pandy?
Inna odpowiedź sugeruje:
Pandy to popularna biblioteka, ale nie ma jej w standardowej bibliotece. Dodanie go jako wymagania nie jest trywialne.
Istnieją wbudowane rozwiązania dla tego przypadku użycia w samym obiekcie listy, a także w bibliotece standardowej.
Jeśli twój projekt nie wymaga już pand, głupotą byłoby uczynienie go wymogiem tylko dla tej funkcjonalności.
źródło
Porównałem wszystkie sugerowane rozwiązania (i kilka nowych) z perfplot ( mój mały projekt).
Liczenie jednego przedmiotu
Okazuje się, że w przypadku wystarczająco dużych tablic
jest nieco szybszy niż inne rozwiązania.
Liczenie wszystkich przedmiotów
Jak ustalono wcześniej ,
jest tym, czego chcesz.
Kod do odtworzenia wykresów:
2)
źródło
Jeśli chcesz policzyć wszystkie wartości naraz , możesz to zrobić bardzo szybko, używając tablic numpy i
bincount
w następujący sposóbco daje
źródło
Jeśli możesz użyć
pandas
, tovalue_counts
jest tam na ratunek.Automatycznie sortuje również wynik na podstawie częstotliwości.
Jeśli chcesz, aby wynik znalazł się na liście, wykonaj następujące czynności
źródło
Dlaczego nie skorzystać z pand?
Wynik:
Jeśli szukasz liczby konkretnego elementu, powiedz a , spróbuj:
Wynik:
źródło
Miałem dzisiaj ten problem i opracowałem własne rozwiązanie, zanim pomyślałem o sprawdzeniu SO. To:
jest naprawdę bardzo powolny w przypadku dużych list. Moje rozwiązanie
jest w rzeczywistości nieco szybszy niż rozwiązanie Counter, przynajmniej w Pythonie 2.7.
źródło
źródło
Poniżej znajdują się trzy rozwiązania:
Najszybszym jest użycie pętli for i przechowywanie jej w Dict.
Wynik
źródło
Policz wszystkie elementy za pomocą
itertools.groupby()
Istnieje również możliwość uzyskania liczby wszystkich elementów na liście za pomocą
itertools.groupby()
.Liczy się „duplikat”
Zwroty
Zauważ, jak połączyło pierwsze trzy
a
jako pierwszą grupę, podczas gdy inne grupya
znajdują się w dalszej części listy. Dzieje się tak, ponieważ lista wejściowaL
nie została posortowana. Może to być czasem korzystne, jeśli grupy faktycznie powinny być oddzielne.Z unikalnymi liczbami
Jeśli wymagane są unikalne liczby grup, wystarczy posortować listę danych wejściowych:
Zwroty
Uwaga: W przypadku tworzenia unikalnych zliczeń wiele innych odpowiedzi zapewnia łatwiejszy i bardziej czytelny kod w porównaniu do
groupby
rozwiązania. Ale pokazano tutaj, aby narysować równolegle do duplikatu przykładu zliczania.źródło
Sugerowano użycie liczby binarnej numpy , jednak działa ona tylko dla tablic 1d z nieujemnymi liczbami całkowitymi . Również wynikowa tablica może być myląca (zawiera występowanie liczb całkowitych od min do maks. Oryginalnej listy i ustawia na 0 brakujące liczby całkowite).
Lepszym sposobem na zrobienie tego za pomocą numpy jest użycie unikalnej funkcji z atrybutem
return_counts
ustawionym na True. Zwraca krotkę z tablicą unikalnych wartości i tablicą występowania każdej unikalnej wartości.a następnie możemy je sparować jako
Działa również z innymi typami danych i „listami 2d”, np
źródło
Aby policzyć liczbę różnych elementów mających wspólny typ:
daje
3
, nie 6źródło
Chociaż jest to bardzo stare pytanie, ale ponieważ nie znalazłem jednej wkładki, zrobiłem jedną.
źródło
Możesz także użyć
countOf
metody wbudowanego modułuoperator
.źródło
countOf
jest wdrażany? Jak wypada w porównaniu z bardziej oczywistymilist.count
(jakie korzyści z wdrożenia C)? Czy są jakieś zalety?Może nie być najbardziej wydajny, wymaga dodatkowego przejścia, aby usunąć duplikaty.
Wdrożenie funkcjonalne:
zwroty :
lub wróć jako
dict
:zwroty :
źródło
Zwróci to liczbę wystąpień twojej wartości
źródło
Chciałbym skorzystać
filter()
z przykładu Łukasza:źródło
jeśli chcesz mieć kilka wystąpień dla danego elementu:
źródło
źródło
spowoduje to rekurencyjne zliczanie lub wyszukiwanie elementu na liście, nawet jeśli jest on na liście list
źródło