用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))