在Python中,如果它等于某个值,如何循环遍历字典并更改该值?

在Python中,如果它等于某个值,如何循环遍历字典并更改该值?,python,dictionary,Python,Dictionary,如果值为None,我想将其更改为“”(空字符串) 我是这样开始的,但我忘了: for k, v in mydict.items(): if v is None: ... right? 在更一般的情况下,例如,如果您正在添加或删除键,那么更改正在循环的容器的结构可能不安全——因此使用项在独立的列表副本上循环可能比较谨慎——但是在给定的现有索引处指定不同的值不会产生任何问题,因此,在Python 2.any中,最好使用iteritems 然而,在Python3中,代码给出了Attribut

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

我是这样开始的,但我忘了:

for k, v in mydict.items():
    if v is None:
... right?
在更一般的情况下,例如,如果您正在添加或删除键,那么更改正在循环的容器的结构可能不安全——因此使用
在独立的列表副本上循环可能比较谨慎——但是在给定的现有索引处指定不同的值不会产生任何问题,因此,在Python 2.any中,最好使用
iteritems

然而,在Python3中,代码给出了
AttributeError:“dict”对象没有属性“iteritems”
错误。在此处使用
items()
而不是
iteritems()


参考

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

mydict = dict((k, v if v else '') for k, v in mydict.items())

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

tmp = dict((k,"") for k,v in mydict.iteritems() if v is None)
mydict.update(tmp)
更新-进行了一些性能测试


好的,在尝试了100到10000个条目的dict后,Alex的解决方案的性能是这个解决方案的两倍左右。

如果您使用
.items()
则(对于python2),如果您将
mydict
修改为
.items()的列表,则没有关系(对于python2)
即使您添加/删除了
mydict的键,返回值也不会改变
仅更改dict中的值从来都不是问题;悲伤是由于在重复听写时添加/删除键造成的。理解比什么更快?非常快:当有一个或两个“无”要更改时,复制整个dict。说到Nones,如果v不是None,你应该使用
,而不是
如果v
(重新阅读问题)。总体摘要:-1您的解决方案将0、空列表和布尔上下文中所有为False的内容替换为
'
。我建议将
if v
替换为
if v is None
,这也更符合PEP 8:@John,它适用于任何内置容器——就像适用于dict一样适用于列表——我认为“index”是比“key”更通用的术语。
mydict[k]='
——您的示例将
k
索引更新为不可变对象,
。因此在此之后,
k
将指向与
v
完全不同的对象。这会不会以某种方式改变
k
索引,导致
.iteritems()
出现问题?@CivFan,不,更改或重新分配值(与键相反)不会给
dict.iteritems带来问题。。。我想知道在添加/删除密钥时使用
.items
循环的建议是否谨慎。我不知道
dict\u items
对象的实现细节,但如果添加/删除键,似乎仍然存在问题。在这种情况下,迭代一个键列表可能是最安全的:
对于列表中的k(mydict):v=mydict[k]嗯,对于Python2.7,我看到的性能大致相同(尽管Alex的方法仍然更快);我已经试过1000次了。。100000个值,无百分比从2%到50%;相比之下,来自的方法(使用s/items/iterms/)大约慢4倍。我认为这有点有趣,因为你的表单允许你在迭代中修改字典。
tmp = dict((k,"") for k,v in mydict.iteritems() if v is None)
mydict.update(tmp)