2011-01-06 7 views
2

in Ordnung, ich will wissen, was die beliebteste Farbe ist, kann ich es tunPython-Liste - Speichern der beliebtesten Farbe

eine Liste mit
popular.append("red") 
popular.append("blue") 
popular.append("green") 
popular.append("red") 
popular.append("yellow") 
popular.append("red") 
popular.append("blue") 
popular.append("red") 
popular.append("yellow") 

, was ich will, ist

red,blue,yellow,green 

ist es Eine nette Art, dass dies mit einer Python-Liste gemacht werden kann - ich habe mich daran erinnert, dass ich im Web einen Eintrag über die Liste und all die coolen Dinge gesehen habe, für die sie verwendet werden kann - ich erinnere mich, dass einer von ihnen war.

Sagen wir, ich möchte die beliebtesten Seiten eines Benutzers auf meiner Website speichern - sagen die Top 5 meistbesuchten Seiten - könnte ich es mit einer Liste oder einem Wörterbuch tun - und wäre das ein vernünftiger Ansatz?

+0

Warum muss es eine Liste sein? Es ist das falsche Werkzeug ... –

+0

Ich habe verschiedene Lösungen gesehen, die alle Auswahlen speichern werden - was - ich erinnere mich daran, war eine Lösung, wo die Liste nicht jede Auswahl speicherte - nur die populärste, oder die Tendenz? So war es möglich, 10 Trendfarben zu speichern. Aber wie gesagt, ich träume vielleicht von Redbull. – spidee

+0

Kein Grund, wenn Sie meinen obigen Kommentar sehen - es war nicht ein Fall der Speicherung aller Auswahlen - also war es Trend? – spidee

Antwort

4

Sie können die Klasse Counter verwenden, um Informationen über die Anzahl der Vorkommen in einer Liste zu erhalten.

Wenn Sie die Liste selbst erstellen, können Sie anstelle der Liste, die die Daten enthält, einfach Dictionary verwenden und den Wert erhöhen, wobei jede Farbe der Schlüssel ist.

Weitere Einzelheiten auf der Grundlage Ihrer edit:
Der Ansatz, den Sie wählen, hängt davon ab, was Ihr Datenmodell aussieht.

Wenn Ihre Website-Statistiken von einem Drittanbietermodul verarbeitet werden, wird möglicherweise nur eine API bereitgestellt, die eine Liste der Website-Besuche für einen bestimmten Benutzer zurückgibt. Da der Startpunkt eine Liste ist, ist es sinnvoll, sie einfach auf Counter zu füttern und dann die oberen Werte von dort zu ziehen.

Wenn Sie diese Daten jedoch persistent speichern, ist es sinnvoll, die Werte direkt in ein Wörterbuch einzugeben (Seite ist der Schlüssel, Besuchszählung ist der Wert). Auf diese Weise können Sie schnell auf die Anzahl der Besuche für jede Seite zugreifen und mit nur einer Iteration über die Schlüssel/Wert-Paare herausfinden, welche Seiten zu den ersten fünf gehören.

0

list.count(x) werden Ihnen die Anzahl, wie oft x in der Liste angezeigt wird: Python Docs

Von dieser Bestellung Dingen ist recht einfach.

4

Lets mit the right way starten:

popular = ['red', 'blue', 'green', 'red', 'yellow', 
      'red', 'blue', 'red', 'yellow'] 

from collections import Counter 
c = Counter(popular) 
# lists the elements and how often they appear 
print c.most_common() 
# -> [('red', 4), ('blue', 2), ('yellow', 2), ('green', 1)] 

@spidee: Wenn Sie erwähnen „Trending“ Ich glaube, Sie meinen, dass Sie in den letzten 1000 (oder so) Farben aussehen wollen und sehen, welche die meisten sind verbreitet?

Sie können ein verwenden dequeue (es ist wie eine Liste) um die letzten Artikel zu halten und einen Zähler zu aktualisieren, um sie zu zählen:

from collections import Counter, deque 

def trending(seq, window=1000, n=5): 
    """ For every item in `seq`, this yields the `n` most common elements. 
     Only the last `window` elements are stored and counted """ 
    c = Counter() 
    q = deque() 
    it = iter(seq) 

    # first iterate `window` times: 
    for _ in xrange(window): 
     item = next(it) # get a item 
     c[item]+=1 # count it 
     q.append(item) # store it 
     yield c.most_common(n) # give the current counter 

    # for all the other items: 
    for item in it: 
     drop = q.popleft() # remove the oldest item from the store 
     c[drop] -=1 
     if c[drop]==0: 
      # remove it from the counter to save space 
      del c[drop] 

     # count, store, yield as above 
     c[item] +=1 
     q.append(item) 
     yield c.most_common(n) 


for trend in trending(popular, 5, 3): 
    print trend 
+0

Das ist wirklich schlau - ich denke, das ist, was ich will, ich werde mit diesem Code spielen und sehen, ob ich es funktionieren kann und es funktioniert - könnte ein wenig Hilfe brauchen - – spidee

2

, wenn Sie mit Python sind < 2.7, die nicht collections.Counter haben Sie können:

>>> popular = ['red', 'green', 'blue', 'red', 'red', 'blue'] 
>>> sorted(set(popular), key=lambda color: popular.count(color), reverse=True) 
['red', 'blue', 'green'] 
+0

Kein Zähler in Python <2.7 –

+0

@ THC4k : Oh ja, danke für die Bemerkung – mouad

Verwandte Themen