count caractères - nombre de fréquence d'éléments en python




la exemple (10)

Si vous utilisez python 2.7 + / 3.1 +, il existe une classe de compteurs dans le module des collections qui est spécialement conçue pour résoudre ce type de problème:

>>> from collections import Counter
>>> words = "apple banana apple strawberry banana lemon"
>>> freqs = Counter(words.split())
>>> print(freqs)
Counter({'apple': 2, 'banana': 2, 'strawberry': 1, 'lemon': 1})
>>> 

Étant donné que les versions 2.7 et 3.1 sont toujours en version bêta, il est peu probable que vous l'utilisiez, alors gardez à l'esprit qu'une façon standard de faire ce genre de travail sera bientôt disponible.

Je suis un novice python, alors peut-être ma question est très noob. Supposons que j'ai une liste de mots, et je veux trouver le nombre de fois que chaque mot apparaît dans cette liste. Manière évidente de faire ceci est:

words = "apple banana apple strawberry banana lemon"
uniques = set(words.split())
freqs = [(item, words.split.count(item)) for item in uniques]
print(freqs)

Mais je trouve que ce code n'est pas très bon, parce que ce programme parcourt deux fois la liste de mots, une fois pour construire l'ensemble, et la deuxième fois en comptant le nombre d'apparences. Bien sûr, je pourrais écrire une fonction pour parcourir la liste et faire le comptage, mais ce ne serait pas si pythonique. Alors, y a-t-il une manière plus efficace et pythonique?


Il m'est arrivé de travailler sur un exercice Spark, voici ma solution.

tokens = ['quick', 'brown', 'fox', 'jumps', 'lazy', 'dog']

print {n: float(tokens.count(n))/float(len(tokens)) for n in tokens}

** # sortie de ce qui précède **

{'brown': 0.16666666666666666, 'lazy': 0.16666666666666666, 'jumps': 0.16666666666666666, 'fox': 0.16666666666666666, 'dog': 0.16666666666666666, 'quick': 0.16666666666666666}

freqs = {}
for word in words:
    freqs[word] = freqs.get(word, 0) + 1 # fetch and increment OR initialize

Je pense que cela aboutit à la même chose que la solution de Triptych, mais sans importer de collections. Aussi un peu comme la solution de Selinap, mais plus lisible. Presque identique à la solution de Thomas Weigel, mais sans utiliser d'exceptions.

Cela pourrait être plus lent que d'utiliser defaultdict () de la bibliothèque de collections cependant. Comme la valeur est récupérée, incrémentée puis à nouveau affectée. Au lieu d'être simplement incrémenté. Cependant, utiliser + = peut faire exactement la même chose en interne.


La réponse ci-dessous prend quelques cycles supplémentaires, mais c'est une autre méthode

def func(tup):
    return tup[-1]


def print_words(filename):
    f = open("small.txt",'r')
    whole_content = (f.read()).lower()
    print whole_content
    list_content = whole_content.split()
    dict = {}
    for one_word in list_content:
        dict[one_word] = 0
    for one_word in list_content:
        dict[one_word] += 1
    print dict.items()
    print sorted(dict.items(),key=func)

words = "apple banana apple strawberry banana lemon"
w=words.split()
e=list(set(w))       
for i in e:
   print(w.count(i))    #Prints frequency of every word in the list

J'espère que cela t'aides!


Sans defaultdict:

words = "apple banana apple strawberry banana lemon"
my_count = {}
for word in words.split():
    try: my_count[word] += 1
    except KeyError: my_count[word] = 1

Tu ne peux pas utiliser le nombre?

words = 'the quick brown fox jumps over the lazy gray dog'
words.count('z')
#output: 1

defaultdict à la rescousse!

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"

d = defaultdict(int)
for word in words.split():
    d[word] += 1

Cela fonctionne dans O (n).


Utilisez reduce () pour convertir la liste en dict unique.

words = "apple banana apple strawberry banana lemon"
reduce( lambda d, c: d.update([(c, d.get(c,0)+1)]) or d, words.split(), {})

résultats

{'strawberry': 1, 'lemon': 1, 'apple': 2, 'banana': 2}

Un premier élément de réponse: <iostream> est lent. Bon sang. Je reçois un énorme gain de performance avec scanf comme dans le dessous, mais il est toujours deux fois plus lent que Python.

#include <iostream>
#include <time.h>
#include <cstdio>

using namespace std;

int main() {
    char buffer[10000];
    long line_count = 0;
    time_t start = time(NULL);
    int sec;
    int lps;

    int read = 1;
    while(read > 0) {
        read = scanf("%s", buffer);
        line_count++;
    };
    sec = (int) time(NULL) - start;
    line_count--;
    cerr << "Saw " << line_count << " lines in " << sec << " seconds." ;
    if (sec > 0) {
        lps = line_count / sec;
        cerr << "  Crunch speed: " << lps << endl;
    } 
    else
        cerr << endl;
    return 0;
}




python count frequency counting