【发布时间】:2011-01-19 21:46:00
【问题描述】:
如果值为None,我想将其更改为“”(空字符串)。
我是这样开始的,但我忘记了:
for k, v in mydict.items():
if v is None:
... right?
【问题讨论】:
标签: python dictionary
如果值为None,我想将其更改为“”(空字符串)。
我是这样开始的,但我忘记了:
for k, v in mydict.items():
if v is None:
... right?
【问题讨论】:
标签: python dictionary
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 对象的实现细节,但如果您正在添加/删除密钥,您似乎仍然有问题iterating over them in python3.x。在这种情况下,遍历键列表可能是最安全的:for k in list(mydict): v = mydict[k]; ...
理解通常更快,这样做的好处是在迭代过程中不编辑mydict:
mydict = dict((k, v if v else '') for k, v in mydict.items())
【讨论】:
.items(),那么(对于python2)如果您修改mydict 因为.items() 返回的列表不会改变,即使您添加/删除@ 的键也不会改变987654327@
if v is not None 而不是if v(重新阅读问题)。总体总结:-1
'' 替换了 0、空列表和布尔上下文中为 False 的所有内容。我建议用if v is None 替换if v,这也更符合PEP 8:python.org/dev/peps/pep-0008/#programming-recommendations
您可以只对值为 None 的元素创建一个字典理解,然后更新回原来的:
tmp = dict((k,"") for k,v in mydict.iteritems() if v is None)
mydict.update(tmp)
更新 - 做了一些性能测试
好吧,在尝试了 100 到 10,000 个项目的 dicts 后,具有不同百分比的 None 值,Alex 的解决方案的性能全面快于这个解决方案的两倍。
【讨论】: