【问题标题】:Remove certain keys from a dictionary in python从python中的字典中删除某些键
【发布时间】:2011-02-17 12:38:30
【问题描述】:

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

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

问题是,我希望从字典中删除集合中只有一个值的所有字段。我一直在写这样的代码:

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

但收到错误“RuntimeError: dictionary changed size during execution”。 (不足为奇,因为这就是我正在做的事情。)如果我必须拼凑某种解决方法,这不是万能的,但有可能做到这一点吗?

【问题讨论】:

    标签: python dictionary python-3.x


    【解决方案1】:

    改为迭代 .keys() 的返回值。由于您会返回一个键列表,因此在您调用它后更改字典不会影响它。

    【讨论】:

    • 也就是说把第一行换成这样:for field in FieldSet.keys():
    • 我其实用的是python3,所以更正的行是:for field in list(FieldSet.keys()):
    • 在这种情况下不需要转换为列表。
    • 也许,但它似乎继续抛出与 Smashery 建议的代码相同的错误。
    • 在这种情况下,列表转换是必要的,因为生成器是惰性求值的,因此它本身很容易在迭代中被修改。转换为列表会在迭代开始之前取出所有键。
    【解决方案2】:

    有时(取决于执行的更改量)构建一个新名称并将其绑定到现有名称的替代方法是有时(取决于执行的更改量):

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

    【讨论】:

      【解决方案3】:

      有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

      刚刚试了一下,效果和宣传的一样。

      【讨论】:

        猜你喜欢
        • 2021-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-18
        • 1970-01-01
        • 2014-09-02
        • 1970-01-01
        • 2012-07-01
        相关资源
        最近更新 更多