【问题标题】:Frequency Analysis in Python -Print letters with frequency rather than numbers with frequencyPython 中的频率分析 - 用频率打印字母而不是用频率打印数字
【发布时间】:2011-05-08 03:36:56
【问题描述】:
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 是数字而不是字母,我不确定如何将其转换回字母。

另外,有没有办法将频率/字母放入数组中,以便将它们绘制在直方图中?

【问题讨论】:

  • IntArrayToText 是用什么来调用的?是字符串吗?

标签: python numbers histogram frequency-analysis


【解决方案1】:

应该指出,您没有使用正确类型的参数调用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's answer 让我想起了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}

【讨论】:

    【解决方案2】:

    如果您使用的是 python 2.7 或更高版本,您可以使用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)]
    

    这也将按频率降序返回 (char, frequency) 元组。

    【讨论】:

      【解决方案3】:

      要将数字转换为它所代表的字母,只需使用内置的chr:

      >>> chr(98)
      'b'
      >>> chr(66)
      'B'
      >>> 
      

      【讨论】:

        【解决方案4】:
        >>> 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}
        

        【讨论】:

        • 不错!让我想起了collections.Counter。
        【解决方案5】:

        将频率/字母转换为数组:

        hisArray = [dict[c]/float(n) for c in f]
        

        【讨论】:

          猜你喜欢
          • 2017-08-30
          • 2021-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-04
          相关资源
          最近更新 更多