为什么默认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})
答案 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})