2011-01-06 5 views
2

bien que je veux savoir ce qui est ce que je peux faire la couleur la plus populaire à l'aide d'une listeliste python - le stockage de la couleur la plus populaire

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") 

ce que je veux est

red,blue,yellow,green 

est là Un bon moyen de le faire en utilisant une liste Python - j'ai semblé me ​​rappeler que j'ai vu un article sur le web à propos de la liste et de toutes les choses cool pour lesquelles il peut être utilisé - je me souviens que c'était l'un d'entre eux. Disons que je veux stocker les pages les plus populaires d'un utilisateur sur mon site - disons les 5 pages les plus visitées - pourrais-je le faire avec une liste ou un dictionnaire - et serait-ce une approche raisonnable?

+0

Pourquoi est-ce que ce doit être une liste? C'est le mauvais outil ... –

+0

J'ai vu diverses solutions qui vont stocker toutes les sélections - ce qui - semble rappeler était une solution où la liste ne stockait pas toutes les sélections - juste le plus populaire, ou la tendance? Donc, il était possible de dire stocker 10 couleurs tendance. Mais comme je l'ai dit, je rêve peut-être sur Redbull. – spidee

+0

Aucune raison, si vous voyez mon commentaire ci-dessus - ce n'était pas un cas de stocker toutes les sélections - alors peut-être que c'était tendance? – spidee

Répondre

4

Vous pouvez utiliser la classe Counter pour obtenir des informations sur le nombre d'occurrences dans une liste.

Si vous créez la liste vous-même, au lieu d'avoir déjà la liste contenant les données, vous pouvez simplement utiliser un Dictionary et incrémenter la valeur avec chaque couleur étant la clé.

Plus de détails en fonction de votre édition:
L'approche que vous choisissez dépend de ce que votre modèle de données ressemble.

Si les statistiques de votre site sont importées par un module tiers, elles peuvent uniquement fournir une API qui renvoie une liste de visites de site pour un utilisateur donné. Étant donné que le point de départ est une liste, il est logique de simplement l'alimenter à Counter, puis de tirer les valeurs supérieures à partir de là.

Toutefois, si vous conservez vous-même un stockage persistant de ces données, il est logique de simplement alimenter les valeurs directement dans un dictionnaire (la page est la clé, le nombre de visites est la valeur). De cette façon, vous pouvez accéder rapidement au nombre de visites de chaque page et trouver les pages qui figurent dans les cinq premières avec une seule itération sur les paires valeur/clé.

0

list.count(x) vous donnera le nombre de fois que x apparaît dans la liste: Python Docs

De choses que de commande est assez facile.

4

Commençons par the right way:

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: Quand vous parlez de « tendance » Je suppose que vous voulez dire que vous voulez regarder les 1000 dernières couleurs (ou plus) et voir ceux qui sont les plus commun?

Vous pouvez utiliser un dequeue (c'est comme une liste) pour garder les derniers éléments autour et mettre à jour un compteur pour les compter:

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

C'est vraiment intelligent - je pense que c'est ce que je veux, je vais jouer avec ce code et voir si je peux le façonner et le faire fonctionner - pourrait avoir besoin d'un peu d'aide - – spidee

2

si vous utilisez python < 2.7 qui n'ont pas collections.Counter vous pouvez faire:

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

Pas de compteur en Python <2.7 –

+0

@ THC4k : Ohh oui, merci pour la remarque – mouad

Questions connexes