关于python:如何在字典列表中使用list和dict理解添加键和值?

How to add a key and value using list and dict comprehension in list of dictionaries?

我有一个字典列表,就是,

1
2
ip_list = [{'1403': [-56, -58], 'data': '1'},
           {'1403': [-56, -58], 'data': '0'}]

现在,我需要在字典中添加一个新的键(即"mac")和值(即"xyz"),如果字典包含"data"=1并且结果应该是,

1
2
expected_outcome = [{'1403': [-56, -58], 'data': '1', 'mac':'xyz'},
                    {'1403': [-56, -58], 'data': '0'}]

我试过了,

1
list_dict_comp = [dict(item, **{'mac':'xyz'}) for item in ip_list]

鉴于,上述表达式给出:

1
2
list_dict_comp = [{'1403': [-56, -58], 'data': '1', 'mac':'xyz'},
                  {'1403': [-56, -58], 'data': '0', 'mac':'xyz'}]

有人能帮我用单句话同时使用列表和听写理解来达到"预期的结果"吗?


你得到的原因

1
2
list_dict_comp = [{'1403': [-56, -58], 'data': '1', 'mac':'xyz'},
                  {'1403': [-56, -58], 'data': '0', 'mac':'xyz'}]

这是因为您要向列表中的每个元素添加{'mac':'xyz'}

为什么不让你的生活更轻松,只需迭代IP_列表,如果IP_列表的某个元素的键中存在data,那么添加{'mac':'xyz'}data的值为'1'

1
2
3
4
5
6
7
8
ip_list = [{'1403': [-56, -58], 'data': '1'},
           {'1403': [-56, -58], 'data': '0'}]

for ip in ip_list:
    if ip.get('data') == '1':
        ip['mac'] = 'xyz'
print(ip_list)
#[{'1403': [-56, -58], 'data': '1', 'mac': 'xyz'}, {'1403': [-56, -58], 'data': '0'}]

if-else的帮助下,用list comprehensions来解决这个问题。您可以使用update()函数向字典添加元素。-

1
2
3
4
5
6
7
ip_list = [{'1403': [-56, -58], 'data': '1'}, {'1403': [-56, -58], 'data': '0'}]

[i.update({'mac': 'xyz'}) if i['data']=='1' else i for i in ip_list]        

print(ip_list)
     [{'1403': [-56, -58], 'data': '1', 'mac': 'xyz'},
      {'1403': [-56, -58], 'data': '0'}]


1
2
3
4
5
ip_list = [{'1403': [-56, -58], 'data': '1'},
           {'1403': [-56, -58], 'data': '0'}]
res = [dict(item, **{'mac':'xyz'}) if 'data' in item and item['data'] == '1' else item for item in ip_list]
print(res)
# [{'1403': [-56, -58], 'data': '1', 'mac': 'xyz'}, {'1403': [-56, -58], 'data': '0'}]