удалите пары из вложенного словаря, содержащие символ

#python #dictionary

Вопрос:

У меня есть словарь в следующем формате, и я хочу сохранить только единицы измерения, которые имеют отрицательное значение

 dic = dict(({'a': [{'unit': 'x', 'value': '1', 'type':'int'},{'unit': '19', 'value':'-1', 'input':'man'},{'unit': 'y', 'value':'-2'}],
      'b': [{'unit':'b', 'value': '3', 'type':'int'},{'unit': 'g', 'value':'3'},{'unit': 'tol', 'value':'-12'}]}))
 

У меня есть этот код, в котором переменная out выводит предназначенную часть словаря, но у меня возникают проблемы с добавлением ее обратно в правильный ключ и выводом полного словаря. Также, возможно, неэлегантный способ выбора отрицательных значений заключается в том, что я просто выбираю поля, содержащие » — » в паре значений..

 out=[]
for k, v in dic.items():
    for x in v:
        if '-' in x['value']:
            out=x
    dic[k].append(dict(out))
 

ожидаемый словарь будет выглядеть следующим образом

 dict(({'a': [{'unit': '19', 'value':'-1', 'input':'man'},{'unit': 'y', 'value':'-2'}],
      'b': [{'unit': 'tol', 'value':'-12'}]}))
 

спасибо, что посмотрели

Комментарии:

1. В вашем желаемом результате out есть список, в вашем коде его нет.

Ответ №1:

вы можете использовать понимание для этого

 a = dict(({'a': [{'unit': 'x', 'value': '1', 'type':'int'},{'unit': '19', 'value':'-1', 'input':'man'},{'unit': 'y', 'value':'-2'}], 'b': [{'unit':'b', 'value': '3', 'type':'int'},{'unit': 'g', 'value':'3'},{'unit': 'tol', 'value':'-12'}]}))

b = {k : [x for x in v if '-' in x['value']] for k,v in a.items()}

# or if you want to replace the original dict then replace b by a

a = {k : [x for x in v if '-' in x['value']] for k,v in a.items()}

 

Ответ №2:

Если вам действительно нужны отрицательные числовые значения, приведение str к int / float вместо проверки '-' символа в строке более элегантно.

 >>> new_dic = {}
>>> for key, val in dic.items():
        new_dic[key] = [entry for entry in val if int(entry['value']) < 0]

>>> # or as an equivalent one-liner:
>>> new_dic = {key: [entry for entry in val if int(entry['value']) < 0] for key, val in dic.items()}

>>> from pprint import pprint
>>> pprint(new_dic)
{'a': [{'input': 'man', 'unit': '19', 'value': '-1'},
       {'unit': 'y', 'value': '-2'}],
 'b': [{'unit': 'tol', 'value': '-12'}]}
 

Кроме того, мы можем очистить ваше первоначальное определение словаря. Там происходит очень много ненужных вещей. Нет необходимости заключать все в дополнительные скобки или использовать dict конструктор. Просто используйте {<def'n>} конструкцию напрямую:

 dic = {
    'a': [{'unit': 'x', 'value': '1', 'type':'int'},
          {'unit': '19', 'value':'-1', 'input':'man'},
          {'unit': 'y', 'value':'-2'}],
    'b': [{'unit':'b', 'value': '3', 'type':'int'},
          {'unit': 'g', 'value':'3'},
          {'unit': 'tol', 'value':'-12'}]
}