首页 > 解决方案 > 如何在不创建新键的情况下访问 for 循环中的现有 dict 键?

问题描述

我有一个像这样的字典列表

names = [{'id':1, 'name': 'Alice', 'dep_name':'Pammy', 'is_dep_minor':True, 'is_insured':False},
          {'id':2, 'name': 'Alice', 'dep_name':'Trudyl', 'is_dep_minor':False, 'is_insured':True},
          {'id':3, 'name': 'Bob', 'dep_name':'Charlie', 'is_dep_minor':True, 'is_insured':True},]

我想创建一个新的统一字典,其中包含稍后将填充的新属性。当 Alice 可以嵌套在里面时,我计划消除对 Alice 的两个 dicts 的需要。这就是我到目前为止所拥有的。

results = []
for name in names:
    newdict = defaultdict(dict)
    newdict[name[name]]["NEWKEY"] = None # to be filled in later
    newdict[name[name]]["ANOTHERKEY"] = None # to be filled in later

    innerdict = defaultdict(dict)
    innerdict["dep_name"]["is_minor"] = name["is_dep_minor"]
    innerdict["dep_name"]["is_insured"] = name["is_insured"]

    newdict[name[name]]["DEPENDENTS"] = innerdict
    results.append(newdict)

这给了我

[
  {
    "Alice" : {
      "NEWKEY" : None,
      "ANOTHERKEY" : None,
      "DEPENDENTS" : {
          "Pammy" : {
              "is_minor" : True,
              "is_insured" : False
           }
      }
   }
  },
  {
    "Alice" : {
      "NEWKEY" : None,
      "ANOTHERKEY" : None,
      "DEPENDENTS" : {
          "Trudy" : {
              "is_minor" : False,
              "is_insured" : True
           }
       }
    }
  },
  # and the list goes on
]

我的目标是

  {
    "Alice" : {
      "NEWKEY" : None,
      "ANOTHERKEY" : None,
      "DEPENDENTS" : {
          "Pammy" : {
              "is_minor" : True,
              "is_insured" : False
           },
           "Trudy" : {
              "is_minor" : False,
              "is_insured" : True
           }
       }
    }
  },

有人可以帮我解决这个问题吗?提前致谢

标签: pythondictionarydata-structuresmerge

解决方案


我找到了解决我的问题的方法。我是这样做的

results = {}

def create_dict():
    newdict = {}
    newdict["NEWKEY"] = None # to be filled in later
    newdict["ANOTHERKEY"] = None # to be filled in later

    innerdict = defaultdict(dict)
    innerdict["dep_name"]["is_minor"] = name["is_dep_minor"]
    innerdict["dep_name"]["is_insured"] = name["is_insured"]

    newdict["DEPENDENTS"] = innerdict

    return newdict

for name in names:
    if name["name"] in results.keys():
        dname = name["dep_name"]
        is_minor = name["is_dep_minor"]
        is_insured = name["is_dep_insured"]

        name = results.get(name["name"])
        name["DEPENDENT"][dname]["is_dep_minor"] = is_minor
        name["DEPENDENT"][dname]["is_dep_insured"] = is_insured
    else:
        newdict = create_dict()
        results[name["name"]] = newdict

这个东西给出了想要的输出


推荐阅读