如何从一个字符串创建一个字典,返回每个字符的数量?

7
我希望返回一个字符串,例如'ddxxx',并将其转换为('d': 2, 'x': 3)。到目前为止,我已经尝试过:
result = {}
for i in s:
    if i in s:
        result[i] += 1
    else:
        result[i] = 1
return result   

其中s是字符串,但是我总是得到一个KeyError错误。例如,如果我将s设置为'hello',则返回的错误如下:

result[i] += 1
KeyError: 'h'
4个回答

7
您可以使用collections.Counter轻松解决此问题。 Counter是标准dict的子类型,用于计数。当您尝试增加以前不存在于字典中的东西时,它会自动确保创建索引,因此您不需要自己检查它。
您还可以将任何可迭代对象传递给构造函数,以使其自动计算该可迭代对象中项目的出现次数。由于字符串是字符的可迭代对象,因此您只需将字符串传递给它即可计算所有字符的数量:
>>> import collections
>>> s = 'ddxxx'
>>> result = collections.Counter(s)
>>> result
Counter({'x': 3, 'd': 2})
>>> result['x']
3
>>> result['d']
2

当然,手动操作也可以,你的代码对此几乎已经很好地处理了。由于你得到了一个“KeyError”,说明你试图访问字典中不存在的键。这种情况发生在你遇到一个之前没有计数过的新字符时。你已经尝试通过 if i in s 检查来处理它,但是你检查的对象不正确。 s 是你的字符串,而且由于你正在迭代字符串的字符 i,所以 i in s 总是为真。相反,你想要检查的是 i 是否已经存在于字典 result 中作为一个键。因为如果它不存在,你就将它作为一个新的键添加,并将计数设置为 1
if i in result:
    result[i] += 1
else:
    result[i] = 1

6
问题出在您的第二个条件上。if i in s 检查的是字符串中的字符,而不是字典中的字符。应改为 if i in result.keys() 或者像Neil 提到的那样,可以直接使用 if i in result
示例:
def fun(s):
    result = {}
    for i in s:
        if i in result:
            result[i] += 1
        else:
            result[i] = 1
    return result   

print (fun('hello'))

这将会打印

{'h': 1, 'e': 1, 'l': 2, 'o': 1}

2

使用 collections.Counter 是明智的解决方案。但是如果你确实想要重新发明轮子,可以使用 dict.get() 方法,它允许您为缺失的键提供默认值:

s = 'hello'

result = {}
for c in s:
    result[c] = result.get(c, 0) + 1

print result

输出

{'h': 1, 'e': 1, 'l': 2, 'o': 1}

1

如果您不想使用collections模块,这是一种简单的方法:

>>> st = 'ddxxx'
>>> {i:st.count(i) for i in set(st)}
{'x': 3, 'd': 2}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接