Zastanawiam się, jak skutecznie obliczyć dystrybucję słów na tablicy na podstawie słów z innej tablicy.

Dostarczamy tablicę słów test Zadaniem jest agregowanie wystąpienia słów z {x1}} w nowej tablicy s

for word in test:
    if word not in s:
        mydict[s.count(word)] = 0
    else:           
        mydict[s.count(word)] += 1

Ten kod jest bardzo powolny, częściowo ze względu na brak ulepszeń wydajności i z powodu bardzo powolnej natury Pythona w iTETACJI.

Jaki jest najlepszy sposób na poprawę powyższego kodu?

1
com 3 grudzień 2013, 16:05

2 odpowiedzi

Najlepsza odpowiedź

Powtarzasz Count Iteration za każde słowo w teście, dodając obok wyszukiwania słów z if word not in s. Poprawa może być w obliczaniu liczenia raz:

from collections import Counter
counts = Counter(s)

Następnie uzyskanie hystogramu w drugim przejściu:

distribution = Counter(counts[v] for v in set(test))

Próbny:

>>> test = list('abcdef')
>>> s = list('here comes the sun')
>>> counts = Counter(s)
>>> distribution = Counter(counts[v] for v in set(test))
>>> distribution
Counter({0: 4, 1: 1, 4: 1})
1
alko 3 grudzień 2013, 12:10

Możesz użyć Counter i to jest to, dla czego są

from collections import Counter
print Counter(Counter(test).values())

Na przykład,

test = ["the", "sun", "rises", "in", "the", "sun"]
from collections import Counter
print Counter(test)
print Counter(Counter(test).values())

Wyjście

Counter({'sun': 2, 'the': 2, 'rises': 1, 'in': 1})
Counter({1: 2, 2: 2})
1
thefourtheye 3 grudzień 2013, 12:13