Python:字典的深度附加?在一个表达式中

2024-05-08 17:40:19 发布

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

如何在一个单个表达式中获得字典 其中一个键值对已添加到子字典中 在输入字典里?输入字典应该保持不变。它 可以假定子字典确实存在,并且新的键值对不在子字典中。在

更新2(有关“SOsurvivalConditions”等的定义,请参见下文):

最简洁的方法是:

(SOsurvivalConditions['firstCondition'].setdefault('synonym', 'A modern form of RTFM is: Google It.'), SOsurvivalConditions)[-1]

更新1

这符合给定的要求,并且没有 修改输入字典的副作用:

^{pr2}$

然而,更简洁(但仅限于声明)的方法可以 与助手功能相适应,例如:

import copy
def dictDeepAdd(inputDict, dictKey, newKey, newValue):
    """
      Adds new key-value pair to a sub-dictionary and
      returns a new version of inputDict.

      dictKey is the key in inputDict for which a new
      key-value pair is added.

      Side-effect: none (does not change inputDict).
    """
    toReturn = copy.deepcopy(inputDict)
    toReturn[dictKey][newKey] = newValue
    return toReturn

dictDeepAdd(
                 SOsurvivalConditions,
                 'firstCondition',
                 'synonym',
                 'A modern form of RTFM is: Google It.'
           )

例如:

goodStyle = \
{
    'answer': 'RTFM responses are not acceptable on Stack Overflow - Joel Spolsky has repeatedly said so in the Stack Overflow podcasts.',
    'RTFM'  : 'RTFM is, in the less offensive version, an abbreviation for Read The Fine Manual.',
}

SOsurvivalConditions = \
{
    'moodImperative' : 'be happy',
    'firstCondition' : goodStyle,
}

SOsurvivalConditions中的“firstCondition”现在有两个键值对。 一个新的键值对(“synonym”,“RTFM的现代形式是:googleit”), 需要追加,并且结果应该在单个表达式中可用。在

这是可行的(一行,但在这里分成几行):

{
    'moodImperative': SOsurvivalConditions['moodImperative'],
    'firstCondition' :
        dict(
               SOsurvivalConditions['firstCondition'],
               synonym = 'A modern form of RTFM is: Google It.'
            )
}

并返回:

{'moodImperative': 'be happy', 
 'firstCondition': 
        {'answer': 'RTFM responses are not acceptable on Stack Overflow - Joel Spolsky has repeatedly said so in the Stack Overflow podcasts.', 
         'RTFM': 'RTFM is, in the less offensive version, an abbreviation for Read The Fine Manual.', 
         'synonym': 'A modern form of RTFM is: Google It.'
        }
 }

但是这里面有很多冗余 表达式-所有键都重复。“firstCondition”出现两次。还有别的吗 优雅的方式?在

(这里的数据结构的名称和内容都是虚构的,但代表了我今天遇到的一个真正的问题。Python版本:2.6.2.)。在


Tags: oftheinform字典isgoogleit
3条回答

这里有一个符合您的特殊规格(在您指定的模糊范围内):

(SOsurvivalConditions['firstCondition'].setdefault('synonym', 'A modern form of RTM is: Google It.'), SOsurvivalConditions)[-1]

这确实修改了初始数据结构(而不是像@trupo的答案那样创建新的结构),而且也是一个返回整个字典的表达式(而不是像@Evan的答案那样是一个语句,或者像@Seth那样返回None)。在

当然,有许多变体是可能的(如果您希望新条目覆盖具有相同关键字“synonym”的现有条目,而不是将任何此类现有条目单独保留,您可以使用__setitem__而不是{}——很难猜测在这种转角情况下,您希望发生什么,因为您的初始规范非常模糊而且没有“真实用例”上下文来帮助消除歧义)。在

编辑:现在在注释中澄清了用例(不改变原始数据结构,确实需要一个表达式,但助手函数可以),我建议如下:

^{pr2}$

作为所需的表达式,使用:

addSubEntry(SOsurvivalConditions, 'firstCondition', 'synonym', 'A modern form of RTM is: Google It.')

根据拐角情况下所需的确切行为,有几种变体是可能的。这个版本添加了一个新的字典(只有给定的内部键值对),如果以前没有具有给定外部键的条目;如果有这样的前一个条目,它会尝试将其放入dict(即使它是键值元组的列表),如果不可行,则会引发异常。一个更严格的版本(要求内部条目已经存在并且是dict或dict-like对象,从而引发异常)可以改为使用

inner = result[outerKey].copy()

作为正文中的第二个陈述。在

SOsurvivalConditions['firstCondition']['synonym'] = 'A modern form of RTM is: Google It.'

你在找dict.update(文档here)吗?在

SOsurvivalConditions['firstCondition'].update({'synonym': 'A modern form of RTFM is: Google It.'})

我想是你想要的。在

相关问题 更多 >