我需要在一本词典的基础上加上一本词典

2024-06-26 10:35:51 发布

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

好的,我有一本叫食物的字典。食物有两个元素,它们都是字典本身,蔬菜和奶制品。蔬菜有两种元素根:萝卜,茎:芦笋。乳品厂有奶酪:切达干酪和酸奶:草莓。我还有一本新字典里的水果,红色:樱桃,黄色:香蕉。在

food['veg']['root'] == 'Turnip'
food['dairy']['cheese'] == 'Cheddar' 

等等

^{pr2}$

现在,我想把“水果”字典全部添加到“食物”字典中,这样我就可以:

food['fruit']['red'] == 'Cherry'

我知道我可以这样做:

food['fruit'] = fruit

但这看起来很笨拙。我想做点什么

food.Append(fruit)

但那不能满足我的需要。在

(编辑后删除了变量名的首字母大写,因为这似乎会分散注意力。)


Tags: 元素字典food食物fruit草莓萝卜蔬菜
3条回答

Food['Fruit'] = Fruit是正确和正确的方式(除了大写的名称)。在

正如@kindall明智地在注释中指出的,可能有多个名称引用同一个字典,这就是为什么不能构建一个函数来将对象映射到它的名称,并将其作为fooddict中的新键

你用方括号有什么原因吗?因为您可以用嵌套的文字字典来表示此数据结构:

food = {
    'veg': {
        'red': 'tomato',
        'green': 'lettuce',
    },

    'fruit': {
        'red': 'cherry',
        'green': 'grape',
    },
}

我知道你想做什么。您试图在python中避免DRY。不幸的是,python和许多其他语言在这方面做得很差。在

不过,主要的问题是您将变量的名称与程序中的值混合在一起。这是许多编程语言中常见的错误。

如果您真的想这样做,那么绑定到fruit=...变量的东西需要知道它的名称。在

  • 你是想说,在python中,“把这个dict移植到另一个dict上”。在
  • Python要求您这样说:“将这个dict移植到另一个dict上,将它附加到"Fruit"
  • 唯一的办法就是“水果”这个名字已经在某处存在了。但事实并非如此:它只存在于变量名中,而不存在于程序中。在

有两种解决方案:

  • 您可以避免创建fruit=...变量,而是直接将其移植到"Fruit"名称中。因此,您只需输入“Fruit”一次,但是我们没有像您想要的那样键入somedict["Fruit"],而是避免了输入变量名。这是通过匿名编程实现的:

    somedict["Fruit"] = {'red':'apple', 'yellow':'banana'}
    

遗憾的是,如果您的构造需要语句,python将不允许您这样做;只有当您有一个文本时,您才能避免这种情况。另一种解决方案是:

  • 您可以创建一个为您执行此操作的函数:

    ^{2美元

很遗憾,如果你不需要这样的解释的话。您可以创建一个变量x={'red':...}或其他东西,但这会破坏整个目的。第三种方法是locals(),但这仍然要求您引用名称。在

总之,如果您需要重要的for循环和函数以及IF语句,那么在python中,您所要做的是不可能的,除非您改变了构造fruit=...字典的整个方法。多行lambda、字典理解(dict((k,v) for k,v in ...))、内联IFTRUE if EXPR else IFFALSE等的组合是可能的。这种风格的危险在于它很快变得难以阅读。在

如果你能把你的字典表达成一个字面字典,或者一个字典理解,或者一个你已经写过的函数的输出,这是可能的。事实上,这是相当容易的(见其他答案)。不幸的是,最初的问题并没有说明您是如何构建这些词典的。在

假设这些答案没有回答你的问题(也就是说,你正在以一种非常复杂的方式构建这些问题),你可以编写“元”代码:为你编写字典的代码,并滥用反射。然而,python中最好的解决方案是使用迭代来创建字典。例如:

foods = {
    "Fruit": {...},
    "Meats": makeMeats(),
}
for name,data in ...:
    foods[name] = someProcessing(data)
foods.update(dataFromSomeFile)  #almost same as last two lines

相关问题 更多 >