字典:用空格替换关键字符

时间:2018-05-18 10:58:22

标签: python python-3.x

我的字典看起来像这样:

result =  {'Mars': 1358996659, 'Snickers': 26100257, 'Ben%and%Jerry's': 102656, 'Tootsie%roll': 3825986}

我想删除'%' ,然后用空格替换它。

我已经尝试过遍历这个列表:

for key in result:
if "%" in key:
    key.replace("%"," ")
    print(key)

但它没有用。我也尝试过其他循环,但似乎没有什么对我有用。

我想最终得到一个如下字典:

result =  {'Mars': 1358996659, 'Snickers': 26100257, 'Ben and Jerry's': 102656, 'Tootsie roll': 3825986}

3 个答案:

答案 0 :(得分:2)

使用dictionary comprehension构建新词典,以便您可以一次性更换密钥:

result = {key.replace('%', ' '): value for key, value in result.items()}

理解包括:

  • 用于生成密钥的表达式,即:
  • 之前的部分
  • 用于生成值的表达式,:之后但for
  • 之前的部分
  • 一个for循环;您将获得与key-value循环迭代一样多的for对(除非您添加更多for循环或if过滤器)。

您自己的解决方案不起作用,因为str.replace()会创建一个 new 字符串对象并返回该对象。旧字符串永远不会更改,因为字符串不可变;它们不能就地改变。如果你想循环完成工作,你必须:

  • 存储str.replace()操作的结果。
  • 删除旧密钥(存储其临时引用的值)
  • 将新密钥添加到字典中,使其指向旧密钥的值。

但是,在字典上进行循环(删除和添加键变异)时,循环遍历字典是不安全的,因此不受支持。你必须循环遍历密钥的副本;使用list(result)创建一个:

for key in list(result):
    if '%' in key:
        new_key = key.replace('%', ' ')
        value = result.pop(key)  # remove the old key, store the value
        result[new_key] = value

此时,使用字典理解重新生成字典会更容易。

请注意,在两种方法中,如果用'%'替换' '会导致冲突,则最终可以减少密钥数量!处理后剩余的取决于最后处理的重复密钥。

答案 1 :(得分:0)

  1. 您无法在适当的位置更改字典键。你必须至少暂时创建一个新词典。
  2. 这:key.replace("%"," ")没有做你认为的事情。它不会更改key,它会返回新的值。
  3. 我必须修复您的数据,如下所示:

    >>> result =  {'Mars': 1358996659, 'Snickers': 26100257, "Ben%and%Jerry's": 102656, 'Tootsie%roll': 3825986}
    

    然后:

    >>> result2 = {}
    >>> for key, value in result.items():
            result2[key.replace("%"," ")] = value
    >>> result2
    {'Tootsie roll': 3825986, "Ben and Jerry's": 102656, 'Snickers': 26100257, 'Mars': 1358996659}
    

答案 2 :(得分:0)

下面的代码会将替换的密钥存储在变量中,您可以将其添加到字典中,同时从字典中删除旧密钥和值。以下代码应该为您提供所需的输出:

result =  {'Mars': 1358996659, 'Snickers': 26100257, "Ben%and%Jerry's": 102656, 'Tootsie%roll': 3825986}

for key, value in result.items():
    if '%' in key:
       new_key = key.replace('%', ' ')
       del result[key]
       result[new_key] = value
print(result)

这是你的输出:

{'Mars': 1358996659, 'Snickers': 26100257, "Ben and Jerry's": 102656, 'Tootsie roll': 3825986}