Domanda

Si supponga che ho una lista di parole, e voglio trovare il numero di volte in cui ogni parola compare in tale elenco.

Un modo ovvio per farlo è:

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

Ma trovo questo codice non è molto buona, perché il programma funziona attraverso l'elenco di parole due volte, una per costruire il set, e una seconda volta per contare il numero di presenze.

Naturalmente, potrei scrivere una funzione per eseguire l'elenco e fare il conteggio, ma che non sarebbe stato così Pythonic. Quindi, c'è un modo più efficiente e Pythonic?

È stato utile?

Soluzione

defaultdict per il salvataggio!

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"

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

Questo viene eseguito in O (n).

Altri suggerimenti

Il Counter classe nel modulo collections è appositamente costruito per risolvere questo tipo di problema:

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

approccio standard:

from collections import defaultdict

words = "apple banana apple strawberry banana lemon"
words = words.split()
result = collections.defaultdict(int)
for word in words:
    result[word] += 1

print result

Groupby oneliner:

from itertools import groupby

words = "apple banana apple strawberry banana lemon"
words = words.split()

result = dict((key, len(list(group))) for key, group in groupby(sorted(words)))
print result
freqs = {}
for word in words:
    freqs[word] = freqs.get(word, 0) + 1 # fetch and increment OR initialize

Credo che questo si traduce per la stessa soluzione del Trittico, ma senza importare collezioni. Anche un po 'come la soluzione di Selinap, ma imho più leggibile. Quasi identico alla soluzione di Thomas Weigel, ma senza usare eccezioni.

Questo potrebbe essere più lento rispetto all'utilizzo di defaultdict () dalla libreria collezioni però. Poiché il valore viene recuperato, incrementato e poi assegnato nuovamente. Invece di limitarsi incrementato. Tuttavia usando + = potrebbe fare lo stesso internamente.

Se non si desidera utilizzare il metodo di dizionario standard, si può provare questo (scorrendo la lista incrementare la corretta dict chiave.):

>>> from itertools import groupby
>>> myList = words.split() # ['apple', 'banana', 'apple', 'strawberry', 'banana', 'lemon']
>>> [(k, len(list(g))) for k, g in groupby(sorted(myList))]
[('apple', 2), ('banana', 2), ('lemon', 1), ('strawberry', 1)]

E 'eseguito in O (n log n).

Senza 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

Non puoi semplicemente usare count?

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

mi è capitato di lavorare su qualche esercizio Spark, ecco la mia soluzione.

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

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

** # uscita di quanto sopra **

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

Usa a ridurre () per convertire l'elenco per un singolo dict.

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

ritorna

{'strawberry': 1, 'lemon': 1, 'apple': 2, 'banana': 2}
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

Spero che questo aiuti!

La risposta di seguito prende alcuni cicli in più, ma è un altro metodo

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top