从Python字典中删除特定的键

12

我正在尝试构建一个包含一系列集合的字典:

{Field1:{Value1, Value2, Value3}, Field2{Value4}}

问题是,我想从字典中删除那些只有一个值的字段。我一直在编写这样的代码:

for field in FieldSet:
    if len(FieldSet[field]) == 1:
        del(FieldSet[field])

但是会收到错误信息“RuntimeError:dictionary changed size during execution”(这并不奇怪,因为这就是我正在做的)。如果我必须拼凑出某种解决方法,那也不是万不得已,但是是否有可能做到这一点?

3个回答

22

建议遍历从.keys()返回的值。因为你会得到一个键列表,所以在调用后更改字典不会影响该列表。


1
换句话说,用以下代码替换第一行:for field in FieldSet.keys(): - Smashery
2
我实际上正在使用Python3,所以更正后的代码行是: for field in list(FieldSet.keys()): - Margaret
在这种情况下,不需要将其转换为列表。 - monkut
也许是这样,但是使用Smashery建议的代码似乎仍然会抛出相同的错误。 - Margaret
8
在这种情况下,需要进行列表转换,因为生成器是惰性评估的,因此单独使用时容易受到迭代过程中修改的影响。将其转换为列表可以在迭代开始之前提取所有的键。 - Amber

14

有时候,在原地修改FieldSet并不是首选,具体取决于所做的更改量,因此有时候建立一个新的FieldSet并将其绑定到现有名称可能更加合适:

FieldSet = dict((k, v) for k, v in FieldSet.iteritems()
                if len(v) != 1)

1

有pop方法。它删除由键调用的元素。就您的示例而言,它看起来像:

for field in FieldSet.keys():
    if len(FieldSet[field]) == 1:
        FieldSet.pop(field)

这是在Python 3.2中,但我不确定它是否是一个新功能: http://docs.python.org/dev/library/stdtypes.html#dict.pop

刚试了一下,它的效果和描述的一样。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接