首页 > 解决方案 > 如何在字典列表中唯一地复制字典中的值?

问题描述

更新:抱歉没有仔细使用break and continue,整个逻辑都改变了,只是用break替换了continue,很抱歉在没有清除基本面的情况下发布。

我已阅读此解决方案,但不明白。

背景:我正在开发 Odoo 框架,并进行 api 调用,在字典列表中获得响应。

响应列表非常大,我只想通过创建新的字典列表将其添加到数据库中。

但是当我调用更新函数时,它会再次添加值,所以我想检查该 id 是否唯一存在然后跳过追加,否则将该值添加到列表中。

api响应是这样的:

rooms_list = [
    {
        "id": 1,
        "name": "A",
        "rates": "dictA"
    },
    {
        "id": 2,
        "name": "B",
        "rates": "dictB"
    },
    {
        "id": 3,
        "name": "C",
        "rates": "dictC"
    },
]

我当前的列表最初的值很少:

new_list = [
    {
        "id": 1,
        "name": "A"
    },
    {
        "id":2,
        "name":"B"
    }
]

现在,它应该只将最后一个字典添加到列表中,但它会添加冗余值,我在哪里犯错了?

我的整个代码如下:

print("new_list initially is => ", new_list)
one_record = {}

for i in rooms_list:
    for j in new_list:
        one_record = {}

        print("j is ", j)
        if j["id"] == i["id"]:
            print("escape this record because it exist already in our new_list")
            continue
        else:
            print("else add it in our new_list")
            one_record["id"] = i["id"],
            one_record["name"] = i["name"],

    if one_record != {}:
        print("one_record is not empty for j =>", j)
        new_list.append(one_record)

print("rooms_list is ", rooms_list)
print("new_list is  ", new_list)

输出如下:

('rooms_list is ', [{'rates': 'dictA', 'id': 1, 'name': 'A'}, {'rates': 'dictB', 'id': 2, 'name': 'B'}, {'rates': 'dictC', 'id': 3, 'name': 'C'}])
('new_list is  ', [{'id': 1, 'name': 'A'}, {'id': 2, 'name': 'B'}, {'id': (1,), 'name': ('A',)}, {'id': (2,), 'name': ('B',)}, {'id': (3,), 'name': ('C',)}])

截屏

如何添加没有多余的新词典id

标签: python

解决方案


您可以使用这样的简单循环:

for i in rooms_list:
    if i['id'] not in [item['id'] for item in new_list]:
        new_list.append(i)
print(new_list)

这使:

[{'id': 1, 'name': 'A'},
 {'id': 2, 'name': 'B'},
 {'id': 3, 'name': 'C', 'rates': 'dictC'}]

推荐阅读