#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'}]
}