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

tri*_*o32 6 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   
Run Code Online (Sandbox Code Playgroud)

s字符串在哪里,但我不断得到一个KeyError.例如,如果我把s因为'hello'返回的错误是:

result[i] += 1
KeyError: 'h'
Run Code Online (Sandbox Code Playgroud)

pok*_*oke 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
Run Code Online (Sandbox Code Playgroud)

当然,手动方式也很好,你的代码几乎可以正常工作.既然你得到了KeyError,你就试图访问字典中不存在的密钥.当你碰巧碰到一个你以前没有计算过的新角色时会发生这种情况.你已经尝试用你的if i in s支票来处理它,但你正在检查包含错误的东西.s是你的字符串,因为你正在迭代i字符串的字符,所以i in s总是如此.您想要检查的是是否i已经作为字典中的键存在result.因为如果不是,则将其添加为具有以下计数的新密钥1:

if i in result:
    result[i] += 1
else:
    result[i] = 1
Run Code Online (Sandbox Code Playgroud)


Bha*_*Rao 6

问题出在您的第二个条件上。if i in s正在检查字符串本身而不是字典中的字符。应该改为if i in result.keys()或尼尔提到它可以只是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'))
Run Code Online (Sandbox Code Playgroud)

这将打印

{'h': 1, 'e': 1, 'l': 2, 'o': 1}
Run Code Online (Sandbox Code Playgroud)