在Python中,我如何循环字典并更改值,如果它等于什么?

TIM*_*MEX 67 python dictionary

如果值为None,我想将其更改为""(空字符串).

我这样开始,但我忘了:

for k, v in mydict.items():
    if v is None:
... right?
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 126

for k, v in mydict.iteritems():
    if v is None:
        mydict[k] = ''
Run Code Online (Sandbox Code Playgroud)

在更一般的情况下,例如,如果您要添加或删除密钥,更改正在循环的容器的结构可能不安全 - 因此使用items循环独立列表副本可能是谨慎的 - 但是在给定的现有索引处分配不同的值不会产生任何问题,因此,在Python 2.any中,最好使用它iteritems.

  • @CivFan,nope,改变或重新分配**值**(而不是**键**)不会给`dict.iteritems`带来问题. (3认同)
  • `mydict [k] =''` - 你的例子将`k`索引更新为不可变对象,'''`.所以在此之后,`k`将指向一个完全不同于'v`的对象.这会以某种方式改变`k`索引,这可能会导致`.iteritems()`出现问题吗? (2认同)

Pau*_*McG 14

你可以创建一个dict理解只有值为None的元素,然后更新回原始:

tmp = dict((k,"") for k,v in mydict.iteritems() if v is None)
mydict.update(tmp)
Run Code Online (Sandbox Code Playgroud)

更新 - 做了一些性能测试

好吧,在尝试了100到10,000个项目的序列,使用不同百分比的值时,Alex的解决方案的性能是全面的,大约是该解决方案的两倍.


buc*_*ley 8

理解通常更快,这具有mydict在迭代期间不编辑的优点:

mydict = dict((k, v if v else '') for k, v in mydict.items())
Run Code Online (Sandbox Code Playgroud)

  • 只更改字典中的值绝不是问题; 在迭代dict时添加/删除KEYS会导致悲伤.理解力比什么更快?真的很快:当有一两个Nones要改变时复制整个字典.说到Nones,你应该有`if v is not None`而不是`if v`(重读这个问题).总结:-1 (3认同)