Python 带列表的嵌套dict

Python 带列表的嵌套dict,python,list,dictionary,Python,List,Dictionary,我想构建一个以列表为值的dict,其中包含以列表为值的dict: xml_dict = { 'Spain':['La Palma':[2929, ..], 'Fuerteventura':[5733, ..]], 'Turkey':['Antalya':[16483, ..], 'Izmir':[2927, ...]] ... } 我的出发点是一份清单,上面写着: self.db_data_list = [ {'land': 'Spain', 'giatahotelcode': 2929,

我想构建一个以列表为值的dict,其中包含以列表为值的dict:

xml_dict = { 
'Spain':['La Palma':[2929, ..], 'Fuerteventura':[5733, ..]],
'Turkey':['Antalya':[16483, ..], 'Izmir':[2927, ...]] 
... }
我的出发点是一份清单,上面写着:

self.db_data_list = [
{'land': 'Spain', 'giatahotelcode': 2929, 'zielgebiet_abweichung': 'La Palma'},
{'land': 'Spain', 'giatahotelcode': 5733, 'zielgebiet_abweichung': 'Fuerteventura'}, 
{'land': 'Turkey', 'giatahotelcode': 16483, 'zielgebiet_abweichung': 'Antalya'},
{'land': 'Turkey', 'giatahotelcode': 2927, 'zielgebiet_abweichung': 'Izmir'}
这是我到目前为止的代码:

zg_giata_dict = dict()
country_zg_dict = dict()
xml_dict = dict()

countries = [ value for data_dict in self.db_data_list for key, value in data_dict.iteritems() if key == 'land' ]
countries = set(countries)

zgs = [ value for data_dict in self.db_data_list for key, value in data_dict.iteritems() if key == 'zielgebiet_abweichung' ]
zgs = set(zgs)

for data_dict in self.db_data_list:
    for country in countries:
        if data_dict['land'] == country:
            country_zg_dict.setdefault(country, []).append(data_dict['zielgebiet_abweichung'])
            country_zg_dict[country] = list(set(country_zg_dict[country])) 

for data_dict in self.db_data_list:
    for zg in zgs:
        if data_dict['zielgebiet_abweichung'] == zg: 
            zg_giata_dict.setdefault(zg, []).append(data_dict['giatahotelcode'])

for country, zg_list in country_zg_dict.iteritems():
    for zg, giata_list in zg_giata_dict.iteritems():
        if zg in zg_list:
            xml_dict.setdefault(country, []).append(giata_list)
输出xml_dict:

{'Spain': [[2929, ...], [5733, ...]], 'Turkey': [[16483, ...], [2927, ...]], ... }

我的输出一点也不差-但是我错过了我的
xml\u dict
中的
zielgebiet\u abweichung
(self.db\u data\u list)中的值。我不知道该怎么办。有什么想法吗?

我想你真正需要的是一本以字典为值的字典,里面的字典以列表为值

for hotel in self.db_data_list:
    land = hotel['land']
    town = hotel['zielgebiet_abweichung']
    code = hotel['giatahotelcode']
    if land in all_data:
        if town in all_data[land]:
            all_data[land][town].append(code)
        else:
            all_data[land][town] = [code]
    else:
        all_data[land] = {town: [code]}
这将返回:

{'Turkey': {'Antalya': [16483], 'Izmir': [2927]}, 
 'Spain': {'Fuerteventura': [5733], 'La Palma': [2929]}}
您也可以使用
setdefault
执行相同的操作:

all_data = {}
for hotel in self.db_data_list:
    land = all_data.setdefault(hotel['land'], {})
    town = land.setdefault(hotel['zielgebiet_abweichung'], [])
    town.append(hotel['giatahotelcode'])

您的预期输出--
{'Spain':['La Palma':[2929,…],'Fuerteventura':[5733,…],'Turkey':['Antalya':[16483,…],'Izmir':[2927,…],[Izmir':[2927,…],[/code>不是有效的词典或列表对不起,我的错:
xml(dict={'Spanian':[{'La Palma':[2929,…],'Fuerteventura],'Fuertentura':[{'5733,…],'Fuerteventura,…],[{'Turkey':[{5733,…],'Antainta],'[2927,…]}
Nope,那也不行。你不想要一个嵌套的字典,像
{'Spain':{'La Palma':[2929,…],'Fuerteventura':[5733,…]},'Turkey':{'Antalya':[16483,…],'Izmir':[2927,…]}
Hmpf,这个很好用。但我还是没有得到它:
town=land.setdefault(hotel)['zielgebiet_abweichung'],[])
在我看来,这一行会覆盖land-dict中的键。你能解释一下这一行吗?例如:当我在添加代码之前打印land或town时,它们只是一个空的dict和一个列表。非常感谢你。顺便说一句!
list.setdefault(key,default)
返回与
键相关的值,如果该键在字典中,或者如果不在字典中,则创建该键并将其值设置为
默认值。