【问题标题】:How to delete entries in a dictionary with a given flag in python?如何在python中删除具有给定标志的字典中的条目?
【发布时间】:2010-11-21 06:48:57
【问题描述】:

我有一本字典,我们称它为myDict,在 Python 中,它包含一组类似的字典,它们都具有条目“turned_on : True”或“turned_on : False”。我想删除 myDict 中所有关闭的条目,例如其中“turned_on : False”。在 Ruby 中,我会做这样的事情:

myDict.delete_if { |id,dict| not dict[:turned_on] }

我应该如何在 Python 中做到这一点?

【问题讨论】:

  • id2 中有错字吗?你实际上没有密钥turned_off,是吗?
  • 是的。感谢您指出!

标签: python ruby dictionary


【解决方案1】:

你的意思是这样的?

myDict = {"id1" : {"turned_on": True}, "id2" : {"turned_on": False}}
result = dict((a, b) for a, b in myDict.items() if b["turned_on"])

输出:

{'id1': {'turned_on': True}}

【讨论】:

  • turned_off 只是问题中的拼写错误。
【解决方案2】:

直截了当:

def delete_if_not(predicate_key, some_dict):
    for key, subdict in some_dict.items():
        if not subdict.get(predicate_key, True):
            del some_dict[key]

测试:

mydict = {
        'test1': {
                'turned_on': True,
                'other_data': 'foo',
            },
        'test2': {
            'turned_on': False,
            'other_data': 'bar',
            },
        }
delete_if_not('turned_on', mydict)
print mydict

到目前为止,此页面上的其他答案创建了另一个字典。他们不会删除您实际字典中的键。

【讨论】:

  • 似乎可以保证所有subdicts 都有一个'turned_on' 键。
  • 添加检查没有任何成本,而且该功能现在更加通用(可以在任何字典中使用)。
【解决方案3】:

不清楚你想要什么,但我的猜测是:

myDict = {i: j for i, j in myDict.items() if j['turned_on']}

或者对于旧版本的python:

myDict = dict((i, j) for i, j in myDict.iteritems() if j['turned_on'])

【讨论】:

  • 这是 Python3.0 的东西吗?当然,您不能在 2.5 中执行“dict comprehensions”。
  • Python 3.0 是 Python 的稳定版本。我为那些无法扩展这种原始语法的投票者添加了 py2k 版本。
  • @SilentGhost:虽然我不会反对你,python 3 还没有被广泛使用,因为缺乏有用的第三方库来做简单的事情,比如连接到一些 RDBMS,因此提供了一个py3-only 的答案暂时不受欢迎。
  • @nosklo:我的沮丧是针对那些看不到这种透明语法的人。 py3k 已经发布了将近 9 个月,并且是 python 的稳定版本,只提供 2k 版本也应该不受欢迎,你不觉得吗。按照这个速度,py3k 将在本世纪末被采用。
  • @SilentGhost:好吧,python 2.x 版本在 python 3 上运行得很好,所以它不被反对。即使确实如此,除非明确指出,否则假设每个人都在使用 2.x 仍然是合理的,因为 3.x 仍然很难用于严肃的事情。
【解决方案4】:
d = { 'id1':{'turned_on':True}, 'id2':{'turned_on':False}}
dict((i,j) for i, j in d.items() if not j['turned_on'])

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多