如果值为None,我想将其更改为“”(空字符串)。
我像这样开始,但是我忘记了:
for k, v in mydict.items():
if v is None:
... right?
Answers:
for k, v in mydict.iteritems():
if v is None:
mydict[k] = ''
在更一般的情况下,例如,如果要添加或删除键,则更改正在循环的容器的结构可能并不安全-因此使用循环遍历items
其独立列表副本可能是谨慎的做法-但在给定的现有索引上分配不同的值不会引起任何问题,因此,在Python 2.any中,最好使用iteritems
。
但是在Python3中,代码给出了AttributeError: 'dict' object has no attribute 'iteritems'
错误。使用items()
代替iteritems()
这里。
请参阅这篇文章。
mydict[k] = ''
-您的示例将k
索引更新为不可变的对象''
。因此,在此之后,k
将指向与完全不同的对象v
。这会k
以某种方式引起索引变化.iteritems()
吗?
dict.iteritems
。
.items
在添加/删除键时用于循环的建议是否谨慎。我不知道dict_items
对象的实现细节 ,但是如果要添加/删除键,似乎在python3.x中遍历它们可能仍然存在问题。在这种情况下,遍历密钥列表可能是最安全的: for k in list(mydict): v = mydict[k]; ...
您可以只对值为None的元素创建dict理解,然后更新回原始元素:
tmp = dict((k,"") for k,v in mydict.iteritems() if v is None)
mydict.update(tmp)
更新-做过一些性能测试
好吧,在尝试使用100到10,000个项目的dict,并使用不同的None值百分比之后,Alex的解决方案的性能是该解决方案的整体速度的两倍。
理解通常更快,并且具有mydict
在迭代过程中不进行编辑的优点:
mydict = dict((k, v if v else '') for k, v in mydict.items())
.items()
话,对于python2而言,这并不重要(对于python2),mydict
因为.items()
即使添加/删除了mydict
if v is not None
代替if v
(重新阅读问题)。总体摘要:-1
''
。我建议替换if v
为if v is None
,这也更符合PEP 8:python.org/dev/peps/pep-0008/#programming-recommendations