【问题标题】:Remove key from dictionary in Python returning new dictionary从 Python 中的字典中删除键返回新字典
【发布时间】:2013-07-15 23:50:00
【问题描述】:

我有一本字典

d = {'a':1, 'b':2, 'c':3}

我需要删除一个键,比如 c 并在一个函数调用中返回没有该键的字典

{'a':1, 'b':2}

d.pop('c') 将返回键值 - 3 - 而不是字典。

如果存在,我将需要一个函数解决方案,因为这将进入理解

【问题讨论】:

  • d.pop('c') return d?
  • @VictorCastilloTorres,它返回 'c' 的值,在这种情况下为 3。
  • 我认为这不是True,因为首先您删除了c 的值,现在删除了d = {'a':1, 'b':2},如果您使用return d,这个将返回{'a':1, 'b':2}
  • 哦..我明白你的意思了。我没有意识到你所有的评论都是代码。我以为你在问d.pop('c') 是否会返回 d :) 是的,这会起作用,但我不能使用它。我需要在理解中使用它。

标签: python methods dictionary


【解决方案1】:

这个怎么样:

{i:d[i] for i in d if i!='c'}

它被称为Dictionary Comprehensions,它从 Python 2.7 开始可用。

或者如果您使用的 Python 版本早于 2.7:

dict((i,d[i]) for i in d if i!='c')

【讨论】:

  • 是的,完全有效。我可以使用它:dict(set(d.items()) - {('c', 0)}) 但这是因为我知道 'c' 将取的值。您的解决方案更......全面
  • 在小型数据集(我需要操作的)上的性能大致相同。
  • dict((i,d[i]) for i in d if i!='c') -- 布朗尼指出你没有创建另一个中间列表/元组:)
  • 您的回答在技术上很好,但如果您能解释一些细节会更好,例如它实际上是如何工作的。
  • 我建议使用变量名k 而不是i,因为它存储的是字典键,而不是索引。另请注意,您可以遍历k, v in f.items(),允许您使用v 而不是d[i] 来引用值。最后:{k: v for k, v in d.items() if k != 'c'}
【解决方案2】:

如果您需要一个 表达式 来执行此操作(因此您可以在 lambda 或理解中使用它),那么您可以使用这个 hack 小技巧:使用字典和弹出的元素,然后从元组中取出原始项目:

(foo, foo.pop(x))[0]

例如:

ds = [{'a': 1, 'b': 2, 'c': 3}, {'a': 4, 'b': 5, 'c': 6}]
[(d, d.pop('c'))[0] for d in ds]
assert ds == [{'a': 1, 'b': 2}, {'a': 4, 'b': 5}]

请注意,这实际上修改了原始字典,因此尽管是一种理解,但它并不是纯粹的函数式。

【讨论】:

    【解决方案3】:

    为什么不自己推出呢?这可能比使用字典推导式创建一个新的更快:

    def without(d, key):
        new_d = d.copy()
        new_d.pop(key)
        return new_d
    

    【讨论】:

    • 是的,这是一个解决方案。不幸的是,我坚持使用本机方法,无法添加任何自己的方法。但这完全可行。
    • 只是好奇,你怎么不能自己定义函数呢?
    • 这是一项我只需要使用推导和本机函数来完成的作业,因此也不需要外部模块。
    【解决方案4】:

    当您调用 pop 时,原始字典被原地修改。

    你可以从你的函数中返回那个。

    >>> a = {'foo': 1, 'bar': 2}
    >>> a.pop('foo')
    1
    >>> a
    {'bar': 2}
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    • 不错的技巧:[a.pop('foo'),a][1] 的替代品。实际上,这是我想更普遍使用的构造。它本质上是返回一系列语句的结果
    【解决方案5】:

    这会起作用,

    (lambda dict_,key_:dict_.pop(key_,True) and dict_)({1:1},1)
    

    编辑 如果字典中存在键,这将删除键并返回没有键值对的字典

    在 python 中,有一些函数可以就地改变对象,并返回一个值而不是改变的对象,{}.pop 函数就是一个例子。

    我们可以使用示例中的 lambda 函数,或者在下面更通用 (lambda func:obj:(func(obj) and False) or obj) 改变这种行为,并获得预期的行为。

    【讨论】:

    【解决方案6】:

    我的解决方案

    item = dict({"A": 1, "B": 3, "C": 4})
    print(item)
    {'A': 1, 'B': 3, 'C': 4}
    
    new_dict = (lambda d: d.pop('C') and d)(item)
    print(new_dict)
    {'A': 1, 'B': 3}
    

    【讨论】:

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