【问题标题】:How to add a key and value using list and dict comprehension in list of dictionaries?如何在字典列表中使用列表和字典理解添加键和值?
【发布时间】:2019-09-01 17:55:37
【问题描述】:

我有一个字典列表,

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

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

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

我试过了,

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

然而,上面的表达式给出了,

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

谁能帮我实现“expected_outcome”在一个表达式中同时使用列表和字典理解?

【问题讨论】:

  • 这不是你应该用列表或字典理解来解决的问题。只需编写一个常规的 ol' 循环即可。

标签: python python-3.x list dictionary


【解决方案1】:

你得到的原因

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

是因为您将{'mac':'xyz'} 添加到列表中的每个元素。

如果data 存在于ip_list 元素的键中,并且data 的值为'1',为什么不让您的生活更轻松,只需遍历ip_list 并添加{'mac':'xyz'}

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

【讨论】:

    【解决方案2】:
    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'}]
    

    【讨论】:

    • 对你写的代码做一些解释,这样下次如果有人阅读解决方案,他就会知道发生了什么
    • @DeveshKumarSingh 实际上没有解释会更好,因为这样可以更明显地看出这到底是多么难以理解。希望人们避免使用它。
    • 同意!很多时候列表理解是一个非常难以理解的混乱
    • dict(item, **{'mac':'xyz'}) 可以改写为dict(item, mac='xyz')
    • 也可以将if 'data' in item and item['data'] == '1'缩短为if item.get('data') == '1'
    【解决方案3】:

    使用list comprehensionsif-else 的帮助下解决这个问题。您可以使用update() 函数将元素添加到字典中 -

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

    【讨论】:

    猜你喜欢
    • 2020-03-16
    • 2018-10-19
    • 1970-01-01
    • 2019-03-09
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多