【问题标题】:Create Dictionary of Dictionary Python创建字典 Python 字典
【发布时间】:2016-07-11 14:32:00
【问题描述】:

我正在尝试将字典 (person_profile) 的字典复制到字典 (person_info) 的新字典中,因为我正在尝试将两个不同的字典(person_profile 和 person_attribute 合并到 person_info),但长度和键值不一定相同。下面是我的代码(我更改了变量只是为了让它听起来更简单):

for person in person_profile:
    person_info.update({ 
        person.id :
       {'name' : person.name, 'age' : person.age} 
    })

# And call person_attribute again
for person in person_attribute:
    person_info.update({ 
        person.id :
       {'occupation' : person.occupation, 'gender' : person.gender} 
    })

然而,上述方法似乎创建了一个集合而不是字典。我在其他文章中找不到如何做到这一点。解决此问题的推荐方法是什么?

== 已回答

for person in person_profile:
    person_info[person.id] = {'name' : person.name, 'age' : person.age}

for person in person_attribute:
    person_info[person.id].update({
        'occupation' : person.occupation, 'gender' : person.gender
    })

【问题讨论】:

  • 您的代码没有创建集合,不。您正在在第二个循环中每次完全替换键入person.id 的字典。
  • 请向我们提供一些示例输入(person_info 的起始值,以及虚拟person_profileperson_attribute 列表),以及预期的person_info 输出。
  • 也向我们展示你得到的实际输出。
  • @MartijnPieters 问题是我用第二个字典替换了字典。非常感谢!
  • 以后添加minimal reproducible example(包括我提到的输入和输出),这样我们就可以帮助您,而无需做出(有根据的)猜测。

标签: python dictionary set


【解决方案1】:

您实际上是用person.occupationperson.gender 替换列表中每个人的person.nameperson.age,而不是合并它们。

根据您的代码,我将执行以下操作以将这两个属性都放入字典中:

>>> import collections
>>> person_info = collections.defaultdict(dict)

>>> for person in person_profile:
...     person_info[person.id].update({'name': person.name, 'age': person.age}) 

>>> for person in person_attribute:
...     person_info[person.id].update({'occupation': person.occupation, 'gender': person.gender})

【讨论】:

  • 这个答案有效,除了字典更新的第一次迭代(person_profile),我必须为 person_info[person.id] 分配一个字典(person_info[person.id] = {'name': person.name, 'age' : person.age}) 如果不是,则字典未定义。还是谢谢!
  • @seokhoonlee 你不必那样做。 defaultdict 已经在后台为缺少的键创建了一个空字典,并在您访问它时将其放入 person_info 中,这样您就永远不会遇到 KeyError 异常。试试print(person_info["lorem ipsum"]) 之类的东西,看看会发生什么。
  • 哦,我以为你只是在初始化字典。谢谢吨!
【解决方案2】:

我假设您想要做的是以下内容。 您的代码不像set 那样工作,而是在person_id 匹配时将dict 替换为其他dict

class Person:
    def __init__(self, id, name, age, occupation, gender):
        self.id = id
        self.name = name
        self.age = age
        self.occupation = occupation
        self.gender = gender


person_info = dict()
person_profile = [Person(1, 'Jack', 17, '---', '---'), Person(2, 'Jane', 19, '---', '---')]
for person in person_profile:
    person_info.update({
        person.id :
       {'name' : person.name, 'age' : person.age}
    })

person_attribute = [Person(1, '---', '---', 'Senetor', 'Male'), Person(2, '---', '---', 'Nurse', 'Female')]
for person in person_attribute:
    data = person_info.get(person.id)
    attribute_dict = {'occupation' : person.occupation, 'gender' : person.gender}

    if data:
        data.update(attribute_dict)
    else:
        data = attribute_dict
print(person_info)

【讨论】:

    猜你喜欢
    • 2014-10-02
    • 2019-08-07
    • 2016-11-20
    • 2021-06-25
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    相关资源
    最近更新 更多