簡體   English   中英

在python中創建字典字典

[英]Create dictionary of dictionary in python

問題

我在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))

期望的輸出:

 {"Albania": {"long_name": "Republic of Albania", "iso_code": 8, "iso_short": "AL", "iso_long": "ALB", "capital": "Tirana"},
    "Angola": {"long_name": "Republic of Angola", "iso_code": 24, "iso_short": "AO", "iso_long": "AGO", "capital": "Luanda"}}

實際產量:

{'long_name': 'Republic of Angola', 'iso_code': 24, 'iso_short': 'AO', 'iso_long': 'AGO', 'capital': 'Luanda'}

我該如何解決這個問題?

更改

a.update(sD)

a[z[i].short_name] = 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
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))

@FMc答案很棒,我們可以通過pop刪除short_name。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM