列表中的python update dict或如果不存在则追加

时间:2020-02-05 22:41:58

标签: python python-3.x

我正在尝试更新现有的json文件,该文件在python3中具有字典列表

    .
    .

    "guests": [
        {
            "name": "name1",
            "package": {
                "age": "30",
                "dob": "Oct 10",
                "image": "name1.img",
                "address": "xxx"
            }
        },
        {
            "name": "name2",
            "package": {
                "age": "20",
                "dob": "Oct 10",
                "image": "name2.img",
                "address": "xxx"
            }
        }
    ]

    .
    .

我想用新数据更新每个来宾数据,如果不存在来宾(name),请以新来宾身份将来宾数据追加到列表中。

如何在python中实现呢?

3 个答案:

答案 0 :(得分:2)

您可以使用await Future.forEach(allUserDocuments.documents, (userDocument) async { ... }); 运算符检查字典中是否存在某个键。

in

答案 1 :(得分:1)

data包含您的样本数据列表。 data_new是您要检查的数据是否存在。如果名称存在,则它正在更新data列表并设置一个标志来更新它。如果不存在,则不设置该标志,以便将新数据追加到列表中。

数据列表

data = { "guests": [
        {
            "name": "name1",
            "package": {
                "age": "30",
                "dob": "Oct 10",
                "image": "name1.img",
                "address": "xxx"
            }
        },
        {
            "name": "name2",
            "package": {
                "age": "20",
                "dob": "Oct 10",
                "image": "name2.img",
                "address": "xxx"
            }
        }
    ] }

查询数据

guest_new = {
            "name": "name3",
            "package": {
                "age": "21",
                "dob": "Nov 11",
                "image": "name3.img",
                "address": "xxxxxxxxxx"
            }
        }
guest_flag = 0

更新(如果存在)或添加

for i in range (0, len(data["guests"])):
  if(data['guests'][i]['name'] == guest_new['name']):
    data['guests'][i]['package'] = guest_new['package']
    guest_flag = 1

if(guest_flag == 0):    
  data['guests'].append(guest_new)

答案 2 :(得分:0)

要更新 json 文件,首先需要将其加载到 dict。然后你更新字典。最后,您将更新的 dict 转储回 json 文件。 关于更新guest对象列表,我宁愿构建一个以name为key的guest字典(根据问题描述,期望名字是唯一的)以简化更新路由。

import json

# list of new guests
new_guests = [
  {
    "name": "name1",
    "package": {
      "age": "300",
      "dob": "Jan 1",
      "image": "new_name1.img",
      "address": "yyy"
     }
  },
  {
     "name": "name3",
     "package": {
       "age": "40",
       "dob": "Oct 4",
       "image": "name3.img",
       "address": "zzz"
      }
   }
]

# path to your json file
path_to_json = 'path/to/data.json'

# load json to dict
with open(path_to_json) as f:
  data = json.load(f)

# build dict of json guest using name as key
guests = {x['name']: x for x in data['guests']}

# update guests
for g in new_guests:
  guests[g['name']] = g

# update data and dump it to the file
data['guests'] = [guests[name] for name in guests]
with open(path_to_json, 'w') as f:
  json.dump(data, f)
相关问题