Как удалить записи в словаре с заданным флагом в python? - PullRequest
1 голос
/ 20 августа 2009

У меня есть словарь, давайте назовем его myDict, в Python, который содержит набор похожих словарей, каждый из которых имеет запись "turned_on : True" или "turned_on : False". Я хочу удалить все записи в myDict, которые отключены, например, где "turned_on : False". В Ruby я бы сделал что-то вроде этого:

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

Как мне это сделать в Python?

Ответы [ 4 ]

7 голосов
/ 20 августа 2009

Вы имеете в виду, как это?

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}}
5 голосов
/ 20 августа 2009

Прямой путь:

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

Другие ответы на этой странице до сих пор создают другой диктат. Они не удаляют ключи в вашем настоящем дикте.

3 голосов
/ 20 августа 2009

Непонятно, что вы хотите, но я думаю:

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'])
1 голос
/ 20 августа 2009
d = { 'id1':{'turned_on':True}, 'id2':{'turned_on':False}}
dict((i,j) for i, j in d.items() if not j['turned_on'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...