【问题标题】:Removing entries from a dictionary based on values根据值从字典中删除条目
【发布时间】:2013-02-16 00:07:43
【问题描述】:

我有一本带有字符-整数键值对的字典。我想删除所有值为 0 的键值对。

例如:

>>> hand
{'a': 0, 'i': 0, 'm': 1, 'l': 1, 'q': 0, 'u': 0}

我想把同一个字典简化成这样:

>>> hand
{'m': 1, 'l': 1}

有没有简单的方法可以做到这一点?

【问题讨论】:

标签: python


【解决方案1】:

您可以使用dict comprehension

>>> { k:v for k, v in hand.items() if v }
{'m': 1, 'l': 1}

或者,在 2.7 之前的 Python 中,dict 构造函数与 generator expression 组合:

>>> dict((k, v) for k, v in hand.iteritems() if v)
{'m': 1, 'l': 1}

【讨论】:

  • 请注意,这会删除所有评估为 False 的值。如果您也有非整数值,这会略有不同。
  • @Lattyware:在我看来 OP 只有整数作为值......我只能使用我得到的东西:)
  • 使用.items 而不是.iteritems 对于较大的数据集可能效率非常低。
  • @Don 这取决于您使用的 Python 版本。除非另有说明,否则我通常假设是最新版本。同意我的第二个例子
  • @NiklasB。感谢您提供的信息,我在 2.7 中花了这么多时间,实际上我并不知道这个变化。好东西
【解决方案2】:
hand = {k: v for k, v in hand.iteritems() if v != 0}

对于 Python 2.7 之前的版本:

hand = dict((k, v) for k, v in hand.iteritems() if v != 0)

在这两种情况下,您都会过滤掉值为0 的键,并将hand 分配给新字典。

【讨论】:

  • IMO:由于使用了iteritems,比 Niklas 的回答更好
【解决方案3】:

如果你不想创建一个新的字典,你可以使用这个:

>>> hand = {'a': 0, 'i': 0, 'm': 1, 'l': 1, 'q': 0, 'u': 0}
>>> for key in list(hand.keys()):  ## creates a list of all keys
...     if hand[key] == 0:
...             del hand[key]
... 
>>> hand
{'m': 1, 'l': 1}
>>> 

【讨论】:

  • 这在 Python 3 中是不允许的:Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: dictionary changed size during iteration
  • @bugmenot123 试试for key in list(hand.keys()):
  • 谢谢!我自己最终得到了那个解决方案,但忘记了我在这里发布的。 :)
  • 可以使用list(hand),无需显式调用dict.keys()
【解决方案4】:

字典理解?

{k: v for k, v in hand.items() if v != 0}

在 python 2.6 及更早版本中:

dict((k, v) for k, v in hand.items() if v != 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 2015-05-08
    • 1970-01-01
    相关资源
    最近更新 更多