Utilizarea unui dicționar pentru a număra elementele dintr-o listă [duplicat] (Programare, Python)

Sophie a intrebat.

Sunt nouă în Python și am o întrebare simplă, să zicem că am o listă de elemente:

['apple','red','apple','red','red','pear']

Care este cel mai simplu mod de a adăuga elementele din listă la un dicționar și de a număra de câte ori apare elementul în listă.

Deci, pentru lista de mai sus aș vrea ca rezultatul să fie:

{'apple': 2, 'red': 3, 'pear': 1}

Comentarii

  • vă puteți inspira de aici: stackoverflow.com/questions/2870466/python-histogram-one-liner –  > Por mykhal.
  • stackoverflow.com/questions/13242103/… –  > Por Andrew Tonko.
  • A observat cineva ordinea de ieșire? Este irelevant? –  > Por Nihal Sharma.
8 răspunsuri
Odomontois

în 2.7 și 3.1 există special Counter dict pentru acest scop.

>>> from collections import Counter
>>> Counter(['apple','red','apple','red','red','pear'])
Counter({'red': 3, 'apple': 2, 'pear': 1})

Comentarii

    20

  • Yuck; destul de mult bloat cu scop îngust în biblioteca Python, deja. –  > Por Glenn Maynard.
  • Linia oficială, sau mai degrabă gluma permanentă, este că Guido are o mașină a timpului … –  > Por Muhammad Alkarouri.
  • 19

  • @Glenn Maynard Contorul este doar o implementare a unei multiset care nu este o structură de date neobișnuită, IMO. De fapt, C++ are o implementare în STL numită std::multiset (de asemenea std::tr1::unordered_multiset), astfel încât Guido nu este singurul care își exprimă opinia cu privire la importanța sa. –  > Por awesomo.
  • @awesomo: Nu, nu este comparabil cu std::multiset. std::multiset permite stocarea mai multor valori distincte, dar comparativ egale, ceea ce îl face atât de util. (De exemplu, puteți compara o listă de locații în funcție de temperatura lor și puteți utiliza un multiset pentru a căuta toate locațiile la o anumită temperatură sau interval de temperatură, obținând în același timp inserțiile rapide ale unui set). Counter numără doar repetițiile; valorile distincte se pierd. Acest lucru este mult mai puțin util – nu este nimic mai mult decât un dict înfășurat. Mă îndoiesc că este vorba de un multiset. –  > Por Glenn Maynard.
  • De asemenea, nu este disponibil în toate versiunile python. 🙁 –  > Por riviera.
mmmdreg

Îmi place:

counts = dict()
for i in items:
  counts[i] = counts.get(i, 0) + 1

.get vă permite să specificați o valoare implicită în cazul în care cheia nu există.

Comentarii

    20

  • Pentru cei care nu cunosc python. Acest răspuns este mai bun din punct de vedere al complexității timpului. –  > Por curiousMonkey.
  • Acest răspuns funcționează chiar și pe o listă de numere cu virgulă mobilă, unde unele dintre numere pot fi „0” –  > Por SherylHohman.
  • De asemenea, acest răspuns nu necesită importuri suplimentare. +1 –  > Por Hayden Holligan.
  • Un răspuns excelent. +1 Aș fi interesat să văd o versiune cu o singură linie a acestui răspuns. –  > Por Bigbob556677.
  • soluție excelentă, mulțumesc! –  > Por jagger.
Ashish Kumar Verma

Pur și simplu folosiți lista de proprietate count

i = ['apple','red','apple','red','red','pear']
d = {x:i.count(x) for x in i}
print d

ieșire :

{'pear': 1, 'apple': 2, 'red': 3}

Comentarii

    17

  • Deși funcționează, acest lucru pare a fi ineficient. –  > Por Ouroborus.
  • poți să elaborezi? –  > Por Ashish Kumar Verma.
  • 18

  • Vă adresați count la matrice de atâtea ori câte elemente există în matrice. Soluția dvs. este O(n^2) în timp ce soluția trivială mai bună este O(n). Vezi comentariile la răspunsul lui riviera versus comentariile la răspunsul lui mmdreg. –  > Por Ouroborus.
mechanical_meat
>>> L = ['apple','red','apple','red','red','pear']
>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> for i in L:
...   d[i] += 1
>>> d
defaultdict(<type 'int'>, {'pear': 1, 'apple': 2, 'red': 3})

Comentarii

  • @NickT Este mai aglomerat decât itertools.Counter – și aș fi surprins dacă ar fi mai rapid… –  > Por Shadow.
Stefano Palazzo

Întotdeauna am crezut că pentru o sarcină atât de banală, nu aș vrea să import nimic. Dar s-ar putea să mă înșel, în funcție de faptul că collections.Counter este mai rapid sau nu.

items = "Whats the simpliest way to add the list items to a dictionary "

stats = {}
for i in items:
    if i in stats:
        stats[i] += 1
    else:
        stats[i] = 1

# bonus
for i in sorted(stats, key=stats.get):
    print("%d×'%s'" % (stats[i], i))

Cred că acest lucru ar putea fi preferabil folosirii lui count(), deoarece va parcurge iterabilul doar o singură dată, în timp ce count poate căuta totul la fiecare iterație. Am folosit această metodă pentru a analiza mai mulți megabytes de date statistice și a fost întotdeauna rezonabil de rapidă.

Comentarii

  • Răspunsul dvs. merită mai mult credit pentru simplitatea sa. M-am luptat o vreme cu acest lucru, fiind dezorientat de prostia unora dintre ceilalți utilizatori care sugerau să importe noi biblioteci etc. –  > Por ntk4.
  • ați putea simplifica cu o valoare implicită, astfel d[key] = d.get(key, 0) + 1 –  > Por merhoo.
Pradyot

Luați în considerare collections.Counter (disponibil începând cu python 2.7). https://docs.python.org/2/library/collections.html#collections.Counter

riviera

Ce zici de asta:

src = [ 'one', 'two', 'three', 'two', 'three', 'three' ]
result_dict = dict( [ (i, src.count(i)) for i in set(src) ] )

Acest lucru are ca rezultat

{‘unu’: 1, ‘trei’: 3, ‘doi’: 2}

Comentarii

  • Rețineți că este O(n^2) din cauza n apeluri către src.count(). –  > Por dimo414.
  • Ar fi acest lucru într-adevăr O(n^2)? Având în vedere set(n) != n. – –  > Por Paul.
Nick T
L = ['apple','red','apple','red','red','pear']
d = {}
[d.__setitem__(item,1+d.get(item,0)) for item in L]
print d 

{'pear': 1, 'apple': 2, 'red': 3}

Tags: