首页 > 解决方案 > 基于key:value匹配python修改列表项

问题描述

假设我们有以下列表:

my_list = [{'id': '1', 'status':'new'},
           {'id': '2', 'status':'closed'},
           {'id': '3', 'status':'new'}]

有没有办法改变'status'dict 的'id':'1'

这样,列表将导致:

my_list = [{'id': '1', 'status':'changed'},  # <---
           {'id': '2', 'status':'closed'},
           {'id': '3', 'status':'new'}]

我看到一种方法可能是这样的:

for i in range(len(my_list)):
    if my_list[i]['id'] == 'desired_id':
        my_list[i]['status'] = 'desired_status'
        break

这是唯一的选择还是有“更好”的方法?

标签: pythonpython-3.x

解决方案


除非您可以选择更改数据的结构(例如 dicts 的 dict 而不是 dicts 的列表),否则不能 - 因为它是一个列表,您必须遍历它才能找到匹配的 dict id。因此,如果您仅限于使用列表,唯一需要更改的是循环项目而不是索引:

for d in my_list:
    if d['id'] == 'desired_id':
        d['status'] = 'desired_status'
        break
else:
    print("There is no ID matching the desired search")

但是,如果您可以将数据更改为,例如:

my_dict = {'1': {'status': 'new'},
           '2': {'status': 'closed'},
           '3': {'status': 'new'}}

...那么根本不需要循环(假设ids 不能重复):

try:
    my_dict['desired_id']['status'] = 'desired_status'
except KeyError:
    print("There is no ID matching the desired search")

推荐阅读