默认dict计算python中的空格

时间:2015-02-16 13:55:50

标签: python dictionary

为什么默认dict会计算列表中空格的数量?

我使用默认字典计算字符在单词中出现的次数。但我的代码也计算了单词之间的空白数量。那么我该如何仅计算单词的出现并省略我单词中出现的空白空间。

from collections import defaultdict

def count_var(word):
    d = defaultdict(int)
    for val in word:
        d[val]+=1
    return d

ct = count_var('big data examiner')


print ct

defaultdict(<type 'int'>, {'a': 3, ' ': 2, 'b': 1, 'e': 2, 'd': 1, 'g': 1, 'i': 2, 'm': 1, 'n': 1, 'r': 1, 't': 1, 'x': 1})

2 个答案:

答案 0 :(得分:3)

更改此行

ct = count_var('big data examiner')

ct = count_var('big data examiner'.split())

这会计算单词而不是字符。并回答为什么它是计算空格,因为空格是一个有效的字符,就像任何字母或数字一样,所以它被计算。

另请注意,存在collections.Counter更适合解决此问题,尤其是因为您已从collections导入。

修改

关于如何使用collections.Counter,同样适用于上面的想法。

这会计算字符

>>> Counter('big data examiner')
Counter({'a': 3, 'i': 2, 'e': 2, ' ': 2, 't': 1, 'b': 1, 'n': 1, 'd': 1, 'm': 1, 'g': 1, 'x': 1, 'r': 1})

这会计算

>>> Counter('big data examiner'.split())
Counter({'big': 1, 'data': 1, 'examiner': 1})

编辑#2 计算所有非空格字符

您可以使用str.replace(' ', '')

>>> from collections import Counter
>>> Counter('big data examiner'.replace(' ', ''))
Counter({'a': 3, 'i': 2, 'e': 2, 'x': 1, 'b': 1, 'r': 1, 'g': 1, 'n': 1, 't': 1, 'm': 1, 'd': 1})

答案 1 :(得分:1)

回答具体问题:

  

为什么默认dict会计算列表中空格的数量?

因为空格仍是字符。例如:

>>> list('big data examiner')
['b', 'i', 'g', ' ', 'd', 'a', 't', 'a', ' ', 'e', 'x', 'a', 'm', 'i', 'n', 'e', 'r']
               # ^                        ^

按照目前的说法,您的代码会对每个字符进行计数,包括空格。如果您想从计数中排除空格,则需要明确

def count_var(word):
    d = defaultdict(int)
    for val in word:
        if val != ' ':  # exclude spaces
            d[val]+=1
    return d

或者,不要将' '排除在计数过程之外,只需不要使用该密钥,无论您使用d做什么。


请注意,collections还提供Counter,这可以显着简化您的代码:

>>> from collections import Counter
>>> Counter(char for char in 'big data examiner' if char != ' ')
Counter({'a': 3, 'e': 2, 'i': 2, 'b': 1, 'd': 1, 'g': 1, 'm': 1, 'n': 1, 'r': 1, 't': 1, 'x': 1})