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

2024-05-21 09:01:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望像'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。E、 g.如果我把s作为'hello'返回的错误是:

^{pr2}$

Tags: 字符串inhelloforreturnif错误result
3条回答

使用collections.Counter是明智的解决方案。但是如果您想重新设计轮子,可以使用dict.get()方法,该方法允许您为缺少的键提供默认值:

s = 'hello'

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

print result

输出

^{pr2}$

使用^{}可以很容易地解决这个问题。Counter是标准dict的一个子类型,用于计数。它将自动确保在您尝试增加以前字典中没有的内容时创建索引,因此您不需要自己检查它。在

也可以将任何iterable传递给构造函数,使其自动计算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将始终为true。您需要检查的是i是否已经作为键存在于字典result中。因为如果它没有,你就把它作为一个计数为1的新键来添加:

^{pr2}$

问题是你的第二种情况。if i in s正在检查字符串本身而不是字典中的字符。它应该是if i in result.keys(),或者像Neil mentioned,它可以是{}

示例:

def fun(s):
    result = {}
    for i in s:
        if i in result:
            result[i] += 1
        else:
            result[i] = 1
    return result   

print (fun('hello'))

这会打印出来

^{pr2}$

相关问题 更多 >