Анализ частоты в Python -Печать букв с частотой, а не цифры с частотой - PullRequest
0 голосов
/ 08 мая 2011
s=array1 #user inputs an array with text in it
n=len(s)
f=arange(0,26,1)
import collections
dict = collections.defaultdict(int)
for c in s:
    dict[c] += 1

for c in f:
    print  c,dict[c]/float(n)

В выводе c - цифры, а не буквы, и я не уверен, как преобразовать его обратно в буквы.

Кроме того, есть ли способ получить частоту / буквы в массивы, чтобы можно было отобразить их в гистограмме?

Ответы [ 5 ]

4 голосов
/ 08 мая 2011

Следует отметить, что вы не вызываете map с правильным типом аргументов (таким образом, TypeError).Требуется одна функция и одна или несколько итераций, к которым применяется функция.Ваш второй аргумент - toChar [i], который будет строкой.Все итерируемые элементы реализуют __iter__.Для иллюстрации:

>>> l, t = [], ()
>>> l.__iter__
<<< <method-wrapper '__iter__' of list object at 0x7ebcd6ac>
>>> t.__iter__
<<< <method-wrapper '__iter__' of tuple object at 0x7ef6102c>

Ответ DTing напомнил мне коллекций. Счетчик :

>>> from collections import Counter
>>> a = 'asdfbasdfezadfweradf'
>>> dict((k, float(v)/len(a)) for k,v in Counter(a).most_common())
<<<
{'a': 0.2,
 'b': 0.05,
 'd': 0.2,
 'e': 0.1,
 'f': 0.2,
 'r': 0.05,
 's': 0.1,
 'w': 0.05,
 'z': 0.05}
3 голосов
/ 08 мая 2011

Если вы используете Python 2.7 или выше, вы можете использовать collection.Counter .

Python 2.7 +

>>> import collections
>>> s = "I want to count frequencies."
>>> counter = collections.Counter(s)
>>> counter
Counter({' ': 4, 'e': 3, 'n': 3, 't': 3, 'c': 2, 'o': 2, 'u': 2, 'a': 1, 'f': 1, 'I': 1,     'q': 1, 'i': 1, 's': 1, 'r': 1, 'w': 1, '.': 1})
>>> n = sum(counter.values()) * 1.0   # Convert to float so division returns float.
>>> n
28
>>> [(char, count / n) for char, count in counter.most_common()]
[(' ', 0.14285714285714285), ('e', 0.10714285714285714), ('n', 0.10714285714285714), ('t', 0.10714285714285714), ('c', 0.07142857142857142), ('o', 0.07142857142857142), ('u', 0.07142857142857142), ('a', 0.03571428571428571), ('f', 0.03571428571428571), ('I', 0.03571428571428571), ('q', 0.03571428571428571), ('i', 0.03571428571428571), ('s', 0.03571428571428571), ('r', 0.03571428571428571), ('w', 0.03571428571428571), ('.', 0.03571428571428571)]

Python 3 +

>>> import collections
>>> s = "I want to count frequencies."
>>> counter = collections.Counter(s)
>>> counter
Counter({' ': 4, 'e': 3, 'n': 3, 't': 3, 'c': 2, 'o': 2, 'u': 2, 'a': 1, 'f': 1, 'I': 1,     'q': 1, 'i': 1, 's': 1, 'r': 1, 'w': 1, '.': 1})
>>> n = sum(counter.values())
>>> n
28
>>> [(char, count / n) for char, count in counter.most_common()]
[(' ', 0.14285714285714285), ('e', 0.10714285714285714), ('n', 0.10714285714285714), ('t', 0.10714285714285714), ('c', 0.07142857142857142), ('o', 0.07142857142857142), ('u', 0.07142857142857142), ('a', 0.03571428571428571), ('f', 0.03571428571428571), ('I', 0.03571428571428571), ('q', 0.03571428571428571), ('i', 0.03571428571428571), ('s', 0.03571428571428571), ('r', 0.03571428571428571), ('w', 0.03571428571428571), ('.', 0.03571428571428571)]

Это также вернет кортеж (символ, частота) в порядке убывания частоты.

1 голос
/ 08 мая 2011
>>> a = "asdfbasdfezadfweradf"
>>> import collections
>>> counts = collections.defaultdict(int)
>>> for letter in a:
...     counts[letter]+=1
... 
>>> print counts
defaultdict(<type 'int'>, {'a': 4, 'b': 1, 'e': 2, 'd': 4, 'f': 4, 's': 2, 'r': 1, 'w': 1, 'z': 1})
>>> hist = dict( (k, float(v)/len(a)) for k,v in counts.iteritems())
>>> print hist
{'a': 0.2, 'b': 0.05, 'e': 0.1, 'd': 0.2, 'f': 0.2, 's': 0.1, 'r': 0.05, 'w': 0.05, 'z': 0.05}
1 голос
/ 08 мая 2011

Чтобы преобразовать число в букву, которую оно представляет, просто используйте встроенную chr:

>>> chr(98)
'b'
>>> chr(66)
'B'
>>> 
0 голосов
/ 08 мая 2011

Чтобы преобразовать частоту / буквы в массивы:

hisArray = [dict[c]/float(n) for c in f]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...