【问题标题】:In Python, how do I loop through the dictionary and change the value if it equals something?在 Python 中,如果它等于某个值,我如何循环遍历字典并更改值?
【发布时间】:2011-01-19 21:46:00
【问题描述】:

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

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

for k, v in mydict.items():
    if v is None:
... right?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:
    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()

    参考this post.

    【讨论】:

    • @John,它适用于 any 内置 container - 就像列表和字典一样 - 我认为“索引”是比“键”更通用的术语。
    • mydict[k] = '' -- 您的示例将k 索引更新为不可变对象''。所以在这之后,k 将指向一个与v 完全不同的对象。这是否会以某种方式改变k 索引,从而导致.iteritems() 出现问题?
    • @CivFan,不,更改或重新分配 value(与 key 相对)不会给 dict.iteritems 带来问题。
    • 嗯...我想知道如果您要添加/删除密钥,使用.items 循环的建议是否谨慎。我不知道dict_items 对象的实现细节,但如果您正在添加/删除密钥,您似乎仍然有问题iterating over them in python3.x。在这种情况下,遍历键列表可能是最安全的:for k in list(mydict): v = mydict[k]; ...
    【解决方案2】:

    理解通常更快,这样做的好处是在迭代过程中不编辑mydict

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

    【讨论】:

    • 如果您使用的是.items(),那么(对于python2)如果您修改mydict 因为.items() 返回的列表不会改变,即使您添加/删除@ 的键也不会改变987654327@
    • 只改变字典中的值从来都不是问题;悲伤是由在迭代字典时添加/删除 KEYS 引起的。理解比什么更快?非常快:当有一两个 None 需要更改时,复制整个 dict。说到无,你应该有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
    【解决方案3】:

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

    tmp = dict((k,"") for k,v in mydict.iteritems() if v is None)
    mydict.update(tmp)
    

    更新 - 做了一些性能测试

    好吧,在尝试了 100 到 10,000 个项目的 dicts 后,具有不同百分比的 None 值,Alex 的解决方案的性能全面快于这个解决方案的两倍。

    【讨论】:

    • 嗯,对于 Python 2.7,我看到的性能大致相同(尽管 Alex 的方法总是更快);我尝试了具有 1000 .. 100000 值和从 2 到 50 %% 的无百分比的字典;相比之下,buckley (使用 s/items/iteritems/ )的方法慢了大约 4 倍。我认为这很有趣,因为您的表单允许在迭代时更改字典。
    猜你喜欢
    • 2011-01-16
    • 2013-11-29
    • 2019-09-02
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多