为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

肥皂起泡泡 2022-06-14 16:15:11
抱歉没有仔细使用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?
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

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


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


查看完整回答
反对 回复 2022-06-14
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

由于您只对 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 的顺序


查看完整回答
反对 回复 2022-06-14
?
阿晨1998

TA贡献2037条经验 获得超6个赞

我会维护一组ID:


给定


new_list = [

    {

        "id": 1,

        "name": "A"

    },

    {

        "id":2,

        "name":"B"

    }

]

创建一组 id


ids = 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


查看完整回答
反对 回复 2022-06-14
  • 3 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号