创建字母直方图

时间:2014-04-02 17:57:12

标签: python frequency

所以我想创建一个直方图。 这是我的代码:

def histogram(s):
    d = dict()
    for c in s:
        if c not in d:
            d[c] = 1
        else:
            d[c] += 1
    return d

def print_hist(h):
    for c in h:
        print c, h[c]

它给了我这个:

>>> h = histogram('parrot')
>>> print_hist(h)
a 1
p 1
r 2
t 1
o 1

但我想要这个:

a: 1
o: 1
p: 1
r: 2
t: 1

那么如何按字母顺序获取直方图,区分大小写(所以“a”和“A”相同),并列出整个字母表(所以不在字符串中的字母只得到零) ?

6 个答案:

答案 0 :(得分:3)

只需使用collections.Counter,除非你真的想要自己的:

>>> import collections
>>> c = collections.Counter('parrot')
>>> sorted(c.items(), key=lambda c: c[0])
[('a', 1), ('o', 1), ('p', 1), ('r', 2), ('t', 1)]

编辑:正如评论者指出的那样,您的最后一句话表示您想要在您的单词中没有出现的字母表中所有字母的数据。 Counter对此也有好处,因为正如文档所示:

  

计数器对象有一个字典界面,除了它们为丢失的项目返回零计数而不是提出KeyError

所以你可以迭代string.ascii_lowercase

之类的东西
>>> import string
>>> for letter in string.ascii_lowercase:
...   print('{}: {}'.format(letter, c[letter]))
... 
a: 1
b: 0
c: 0
d: 0
e: 0
f: 0
g: 0
h: 0
i: 0
j: 0
k: 0
l: 0
m: 0
n: 0
o: 1
p: 1
q: 0
r: 2
s: 0
t: 1
u: 0
v: 0
w: 0
x: 0
y: 0
z: 0

最后,不要实现复杂的东西来合并大写和小写字母的结果,而是首先规范化你的输入:

c = collections.Counter('PaRrOt'.lower())

答案 1 :(得分:3)

使用ordered dictionary按照放入的顺序存储密钥。

from collections import OrderedDict
import string

def count(s):
    histogram = OrderedDict((c,0) for c in string.lowercase)
    for c in s:
        if c in string.letters:
            histogram[c.lower()] += 1
    return histogram

for letter, c in count('parrot').iteritems():
    print '{}:{}'.format(letter, c)

结果:

a:1
b:0
c:0
d:0
e:0
f:0
g:0
h:0
i:0
j:0
k:0
l:0
m:0
n:0
o:1
p:1
q:0
r:2
s:0
t:1
u:0
v:0
w:0
x:0
y:0
z:0

答案 2 :(得分:2)

一个简单的答案是:

import string
for letter in string.ascii_lowercase:
    print letter, ': ', h.lower().count(letter)

(当你经历26次字符串时非常低效)

还可以使用Counter

from collections import Counter
import string
cnt = Counter(h.lower())
for letter in string.ascii_lowercase:
    print letter, ': ', cnt[letter]

相当整洁。

答案 3 :(得分:1)

如果您想订购,那么您将不得不使用ordereddictionary

在将字母添加到词典之前,您还需要订购这些字母 我不清楚我认为你想要一个不区分大小写的结果所以我们需要在一个案例中得到所有的字母

from collections import OrderedDict as od
import string

def histogram(s):

首先我们需要创建包含所有小写字母的字典 我们导入了一个字符串,它将为我们提供一个列表,但我认为它全部是小写的,包括unicode,所以我们只需要使用string中的前26个.lowercase

    d = od()
    for each_letter in string.lowercase[0:26]:
       d[each_letter] = 0

一旦创建了字典,我们只需要在它被小写后迭代它。请注意,任何带有数字或空格的单词都会爆炸。您可能想要也可能不想在字典中测试或添加数字和空格。防止它爆炸的一种方法是尝试添加一个值。如果该值不在字典中,则忽略它。

    for c in s.lower():
       try:
           d[c] += 1
       except ValueError:
           pass
    return d

答案 4 :(得分:0)

检查此功能是否有输出

    def print_hist(h):
     for c in sorted(h):
      print c, h[c]

答案 5 :(得分:-1)

如果你想列出整个(仅限拉丁语)字母,你可以使用长度为26的列表:

hist = [0] * 26
for c in s.lower():
  hist[orc(c) - ord('a')] += 1

获得所需的输出:

for x in range(26):
  print chr(x), ":", hist[x]