使用python defaultdi创建嵌套的json

2024-06-07 06:45:57 发布

您现在位置:Python中文网/ 问答频道 /正文

from collections import defaultdict

a = defaultdict(list)
a['Fruits'].append('Mango')
a['Fruits'].append('Durian')
a['Price'].append(10)

>>> a
defaultdict(<class 'list'>, {'Fruits': ['Mango', 'Durian'], 'Price': [10]})

我想使列表中的项成为键并添加值。例如:

{'Fruits': ['Mango' : ['Thailand', 'China'], 'Durian' : ['Malaysia','Singapore']], 'Price': [10]}

有人能帮忙吗?你知道吗


Tags: fromimport列表pricecollectionslistclassappend
1条回答
网友
1楼 · 发布于 2024-06-07 06:45:57

所需的输出不是一个有效的Python格式的输出,无论如何都可以理解您要查找的内容。
构建此数据结构的多种方法(最类似于您的方法)之一是:

a = defaultdict(list)
b = defaultdict(list)
b['Mango'].append('Thailand')
b['Mango'].append('China')
b['Durian'].append('Malaysia')
b['Durian'].append('Singapore')
a['Fruits'].append(b)
a['Price'].append(10)

这是你想要的(无效的)输出和实际输出的对峙:

Desired Output:

{'Fruits': ['Mango' : ['Thailand', 'China'], 'Durian' : ['Malaysia','Singapore']], 'Price': [10]}

Actual Output :

{'Fruits': [{'Mango': ['Thailand', 'China'], 'Durian': ['Malaysia', 'Singapore']})], 'Price': [10]})

请注意,虽然它不是最具python风格的解决方案,也不是真正干净的代码,但我认为您出于特定的原因(更大的代码,遵循一个课程…?)正在初始化一个带有列表的defaultdict你知道吗

假设我们有一家卖水果的商店,你想知道每种水果可能的产地和价格。你知道吗

我们可以开始为每种水果建立一个小字典:

mango = {
    "origin": ["Thailand", "China"],
    "price": 10
}
durian = {
    "origin": ["Malaysia", "Singapore"],
    "price": 42
}
print(mango['origin']) # OUTPUT: ['Thailand', 'China']
print(durian['price']) # OUTPUT: 42

如您所见,我们现在可以访问每个水果的不同信息。现在我们要把它们放在一本字典里:

store = {}
store['Mango'] = mango
store['Durian'] = durian

print(store['Mango']) # OUTPUT: {'origin': ['Thailand', 'China'], 'price': 10}
print(store['Durian']['origin']) # OUTPUT: ['Malaysia', 'Singapore']

现在您可以访问整个水果目录或其中的特定信息。你知道吗

所以当defaultdict开始发挥作用时?
假设您尝试访问一些关于木瓜的信息,一种您尚未插入的水果:

print(store['Papaya']['price'])

它引发了一个错误:

KeyError: 'Papaya'

它引发了一个错误:Papaya不是我们的storedict的键。但是您不希望引发错误;如果在我们的dict中不存在key,则最好返回一个默认值。
那就是defaultdict发挥作用的时候。如documentation中所述,[它]为给定的键提供了一个默认值。你知道吗

所以我们需要一个通用的fruit字典,如果键不存在,它将返回Value not inserted yet

my_fruit = defaultdict(lambda: "Value not inserted yet")

如果键不存在,store字典必须返回my_fruit字典的副本:

my_store = defaultdict(lambda: copy.deepcopy(my_fruit))

导致以下代码:

from collections import defaultdict
import copy

my_fruit = defaultdict(lambda: "Value not inserted yet")
my_store = defaultdict(lambda: copy.deepcopy(my_fruit))

my_store["Mango"]["origin"] = ["Thailand", "China"]
my_store["Mango"]["price"] = 10

my_store["Durian"]["origin"] = ["Malaysia", "Singapore"]
my_store["Durian"]["price"] = 42


print(my_store["Mango"]["price"]) # OUTPUT: 10
print(my_store["Durian"]["origin"]) # OUTPUT: ['Malaysia', 'Singapore']
print(my_store["Mango"]["color"]) # OUTPUT: Value not inserted yet
print(my_store["Papaya"]["price"]) # OUTPUT: Value not inserted yet

如您所见,字典的工作方式与之前完全相同,但是当我们在storedict中插入一个无效的key时,我们会收到一个my_fruitdict的副本,当我们为my_fruitdict插入一个无效的key时,我们会打印出Value not inserted yet。你知道吗


注意:您可以看到Lambdascopy.deepcopy的用法。这些可能是一些高级概念,您可能需要进行一些研究/提出新问题

相关问题 更多 >