1
votes

Comment trier une liste de chaînes par fréquence?

J'ai une liste de fichiers

for i in resl:
    if resl.count(i) > 500:
        resl2.append(i)
print(resl2)

Il y a plus de 700 000 éléments et je dois les trier par fréquence pour voir le fichier le plus consulté et le fichier le moins consulté.

example_list = [7.gif, 8.gif, 123.html]

Quand je lance ceci, il ne se compile jamais. Et j'ai essayé d'autres méthodes mais aucun résultat.


2 commentaires

Il s'agit de déterminer tous les fichiers qui se produisent plus de 500 fois. J'ai juste besoin de savoir quel fichier se produit le plus.


Il se compile, c'est juste très lent, car votre algorithme prend un temps quadratique


4 Réponses :


0
votes

Notez que i représente un élément du tableau et non un entier

for i in range(0,len(resl)-1):
    if i > 500:
        resl2.append(resl[i])
print(resl2)

Remplacez-le par ceci.

for i in resl:
    if resl.count(i) > 500:
        resl2.append(i)
print(resl2)


0 commentaires

3
votes

Votre algorithme est inutilement le temps quadratique. Ce qui suit est linéaire

resl2 = [(k,v) for k,v in Counter(resl).items() if v > 500]
resl2.sort(key=lambda kv: kv[1])
resl2 = [k for k,v in resl2]

Si vous avez besoin de les trier, faites quelque chose comme

from collections import Counter
resl2 = [k for k,v in Counter(resl).items() if v > 500]


2 commentaires

alors ce code trie-t-il également par nombre le plus élevé? ou simplement les ajouter à la liste dans n'importe quel ordre sur plus de 500 occurrences?


Non, il ne trie pas par nombre, mais vous pouvez évidemment le faire



0
votes

Vous pouvez faire cette astuce en utilisant un set ;)

Ici vous avez un exemple minimal pour une liste de fichiers et montrant quand il apparaît 2 fois:

[f for n,f in sorted(zip(files_freq, file_set), key=lambda x: x[0], reverse=True) if n >= 2]

et la sortie sera: ['0.gif', '0.doc']

Le set sera filtrer la liste uniquement aux occurrences uniques de chaque fichier et la boucle calculera le nombre de chaque fichier.

Après, la compréhension de la liste effrayante est le truc !

XXX

Cela créera une liste uniquement avec les fichiers apparus 2 fois ou plus, puis la partie clé force la fonction trié à utiliser le premier files_freq de zip (files_freq, file_set) à faire le tri et reverse est de trier la liste par ordre descendant, en affichant les fréquences les plus élevées avant.


1 commentaires

c'est encore le temps quadratique



1
votes

De votre commentaire :

J'ai juste besoin de savoir quel fichier est le plus fréquent.

Donc:

statistics.mode(example_list)


0 commentaires