Frequency Analysis in Python -Print letters with frequency rather than numbers with frequency
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)
In the output, c i开发者_如何学Gos in numbers rather then letters and I'm not sure how to convert it back to letters.
Also, is there any way to get the frequency/letters into arrays so it'd be possible to plot them in a histogram?
It should be pointed out that you aren't calling map with the right type of arguments (thus the TypeError
). It takes a single function and one or more iterables, to which the function is applied to. Your second argument is toChar[i] which would be a string. All iterables implement __iter__
. To illustrate:
>>> l, t = [], ()
>>> l.__iter__
<<< <method-wrapper '__iter__' of list object at 0x7ebcd6ac>
>>> t.__iter__
<<< <method-wrapper '__iter__' of tuple object at 0x7ef6102c>
DTing's answer reminded me of collections.Counter:
>>> 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}
If you are using python 2.7 or greater you can use collections.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)]
This will also return the (char, frequency) tuple in descending order of frequency.
To convert a number to the letter it represents, simply use the built-in chr
:
>>> chr(98)
'b'
>>> chr(66)
'B'
>>>
>>> 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}
To convert frequency/letters into arrays:
hisArray = [dict[c]/float(n) for c in f]
精彩评论