我有一本词典,我们称之为myDict
,它包含一组类似词典,它们都有条目“turned_on : True
”或“turned_on : False
”。我想删除myDict
中关闭的所有条目,例如其中“turned_on : False
”。在红宝石我会做这样的事情:如何删除Python中给定标志的字典中的条目?
myDict.delete_if { |id,dict| not dict[:turned_on] }
我应该如何在Python中做到这一点?
我有一本词典,我们称之为myDict
,它包含一组类似词典,它们都有条目“turned_on : True
”或“turned_on : False
”。我想删除myDict
中关闭的所有条目,例如其中“turned_on : False
”。在红宝石我会做这样的事情:如何删除Python中给定标志的字典中的条目?
myDict.delete_if { |id,dict| not dict[:turned_on] }
我应该如何在Python中做到这一点?
直接的方式:
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'都具有''turn_on''键。 – SilentGhost 2009-08-20 11:29:24
添加检查费用没有什么,功能现在更通用(可用于任何字典的字典)。 – nosklo 2009-08-20 12:09:53
目前尚不清楚你想要什么,但我的猜测是:
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'。 – 2009-08-20 11:16:33
Python 3.0是python的稳定版本。我为那些无法扩展这种原始语法的downvoters添加了py2k版本。 – SilentGhost 2009-08-20 11:19:00
@SilentGhost:虽然我不会低估你,但python 3还没有被广泛使用,因为缺乏有用的第三方库来完成简单的事情,比如连接到某些RDBMS,因此提供了py3-only的回答一段时间。 – nosklo 2009-08-20 11:21:50
你的意思是这样吗?
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}}
'turn_off'只是在问题中的错字。 – SilentGhost 2009-08-20 11:16:32
谢谢我纠正它 – 2009-08-20 11:17:41
d = { 'id1':{'turned_on':True}, 'id2':{'turned_on':False}}
dict((i,j) for i, j in d.items() if not j['turned_on'])
你在'id2'一个错字?你实际上没有钥匙'turn_off',是吗? – SilentGhost 2009-08-20 11:12:12
是的。感谢您指出! – 2009-08-20 11:13:02
为什么红宝石标签? – 2009-08-20 13:30:02