如何从返回字符数的字符串创建字典

时间:2014-12-27 10:12:26

标签: python string dictionary

我希望将'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 个答案:

答案 0 :(得分:7)

您可以使用collections.Counter轻松解决此问题。计数器是标准字典的子类型,用于计算事物。它会自动确保在您尝试增加以前未在字典中的内容时创建索引,因此您不需要自己检查它。

您还可以将任何iterable传递给构造函数,以使其自动计算该iterable中项目的出现次数。由于字符串是可迭代的字符,因此您只需将字符串传递给它,即可计算所有字符:

>>> 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

答案 1 :(得分:4)

问题在于你的第二个条件。 if i in s正在检查字符串本身中的字符,而不是字典中的字符。它应该是if i in result.keys()或Neil mentioned它可以是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 :(得分: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}

答案 3 :(得分:1)

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

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