如何在字典列表中唯一地复制字典中的值?

抱歉没有仔细使用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',)}])

截屏

http://img3.mukewang.com/62a843aa0001f3e915980896.jpg

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


肥皂起泡泡
浏览 129回答 3
3回答

达令说

您可以使用这样的简单循环: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'}]

慕莱坞森

由于您只对 ID 和名称感兴趣,因此您可以从 dict 列表切换到单个 dict:new_dict = {entry['id']: entry['name'] for entry in new_list}然后,正确使用dict.setdefaultwhich 正是您想要的:插入一个值,除非键已经存在:for entry in rooms_list:     new_dict.setdefault(entry['id'], entry['name'])如果之后您仍然需要列表,您可以轻松地new_dict再次转换为列表:new_list = [{'id': id, 'name': name} for id, name in new_dict.items()]请注意,从 CPython 3.6 开始,这种方法也将保持 items 的顺序。

阿晨1998

我会维护一组ID:给定new_list = [    {        "id": 1,        "name": "A"    },    {        "id":2,        "name":"B"    }]创建一组 idids = set(entry["id"] for entry in new_list)然后for entry in rooms_list:    id = entry["id"]    name = entry["name"    if id not in ids:        new_list += {"id": id, "name": name}        ids.add(id)更好的选择是创建这样的字典而不是您的字典,new_list因为它在更小的空间中包含所有相同的信息,并且会自行强制执行唯一 ID:better_new_list = {    1: "A",    2: "B",}现在添加它是这样的:for entry in rooms_list:    id = entry["id"]    name = entry["name"]    if id not in better_new_list:        better_new_list[id] = name
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python