用python创建字典的字典 问题

用python创建字典的字典 问题,python,class,dictionary,Python,Class,Dictionary,我在for循环的每次迭代中都会得到单独的字典,但是当第二次迭代运行时,它不是将第二个字典添加到第一个字典中,而是将第二个字典替换到第一个字典中 class Nation: def __init__(self, short_name, long_name, iso_code, iso_short, iso_long, capital): self.short_name = short_name self.long_name = long_name

我在
for
循环的每次迭代中都会得到单独的字典,但是当第二次迭代运行时,它不是将第二个字典添加到第一个字典中,而是将第二个字典替换到第一个字典中

class Nation:
    def __init__(self, short_name, long_name, iso_code, iso_short, iso_long, capital):
        self.short_name = short_name
        self.long_name = long_name
        self.iso_code = iso_code
        self.iso_short = iso_short
        self.iso_long = iso_long
        self.capital = capital

def to_dictionaries(z):
    a = {}
    sD = {}
    for i in range(len(z)):
        sD["long_name"] = z[i].long_name
        sD["iso_code"] = z[i].iso_code
        sD["iso_short"] = z[i].iso_short
        sD["iso_long"] = z[i].iso_long
        sD["capital"] = z[i].capital
        a.update(sD)
    return a

new_nation_1 = Nation("Albania", "Republic of Albania", 8, "AL", "ALB", "Tirana")
new_nation_2 = Nation("Angola", "Republic of Angola", 24, "AO", "AGO", "Luanda")
nation_list = [new_nation_1, new_nation_2]
print(to_dictionaries(nation_list))
期望输出: 实际产量: 如何解决此问题?

更改

import json

class Nation:

    def __init__(self, short_name, long_name, iso_code, iso_short, iso_long, capital):
        self.short_name = short_name
        self.long_name = long_name
        self.iso_code = iso_code
        self.iso_short = iso_short
        self.iso_long = iso_long
        self.capital = capital

nations = [
    Nation('Albania', 'Republic of Albania', 8, 'AL', 'ALB', 'Tirana'),
    Nation('Angola', 'Republic of Angola', 24, 'AO', 'AGO', 'Luanda'),
]

d = {n.short_name : dict(n.__dict__) for n in nations}
print(json.dumps(d, indent = 4))
a.update(sD)

因为您需要使用
short_name
作为键

另一个建议是将
sD={}
放在
for
块中。因此,我希望:

def to_dictionaries(z):
    a = {}
    for i in range(len(z)):
        sD = {}
        sD["long_name"] = z[i].long_name
        sD["iso_code"] = z[i].iso_code
        sD["iso_short"] = z[i].iso_short
        sD["iso_long"] = z[i].iso_long
        sD["capital"] = z[i].capital
        a[z[i].short_name] = sD
    return a

@FMc答案很好,我们可以通过pop删除短名称

import json

class Nation:

    def __init__(self, short_name, long_name, iso_code, iso_short, iso_long, capital):
        self.short_name = short_name
        self.long_name = long_name
        self.iso_code = iso_code
        self.iso_short = iso_short
        self.iso_long = iso_long
        self.capital = capital

nations = [
    Nation('Albania', 'Republic of Albania', 8, 'AL', 'ALB', 'Tirana'),
    Nation('Angola', 'Republic of Angola', 24, 'AO', 'AGO', 'Luanda'),
]
nations = [dict(n.__dict__) for n in nations]
# pop will remove short_name from n and returns it's value.
d = {n.pop('short_name') : n for n in nations}
print(json.dumps(d, indent = 4))

此外,OP从不使用索引
i
,因此在z中为国家使用
并将
z[i]
替换为
nation
将更具可读性。此外,应该从n中删除短名称。确实,删除
短名称将更好地匹配OP的文字问题,但这样做几乎没有什么好处——至少在我的经验中是这样。如果你有一个单词对象的dict,那么在各种各样的编程环境中,将所有感兴趣的属性保留在值中几乎总是更方便、更灵活的——即使这意味着外部键确实会在内部dict中复制一条信息。
a[z[i].short_name] = sD
def to_dictionaries(z):
    a = {}
    for i in range(len(z)):
        sD = {}
        sD["long_name"] = z[i].long_name
        sD["iso_code"] = z[i].iso_code
        sD["iso_short"] = z[i].iso_short
        sD["iso_long"] = z[i].iso_long
        sD["capital"] = z[i].capital
        a[z[i].short_name] = sD
    return a
import json

class Nation:

    def __init__(self, short_name, long_name, iso_code, iso_short, iso_long, capital):
        self.short_name = short_name
        self.long_name = long_name
        self.iso_code = iso_code
        self.iso_short = iso_short
        self.iso_long = iso_long
        self.capital = capital

nations = [
    Nation('Albania', 'Republic of Albania', 8, 'AL', 'ALB', 'Tirana'),
    Nation('Angola', 'Republic of Angola', 24, 'AO', 'AGO', 'Luanda'),
]
nations = [dict(n.__dict__) for n in nations]
# pop will remove short_name from n and returns it's value.
d = {n.pop('short_name') : n for n in nations}
print(json.dumps(d, indent = 4))