How do I, in a single expression, get a dictionary where one key-value pair has been added to a sub-dictionary in some input dictionary? The input dictionary should be left unchanged. It can be assumed the sub-dictionary does exist and that the new key-value pair is not already in the sub-dictionary.
Update 2 (see below for definition of "SOsurvivalConditions", etc.):
The most concise way is:
(SOsurvivalConditions['firstCondition'].setdefault('synonym', 'A modern form of RTFM is: Google It.'), SOsurvivalConditions)[-1]
Update 1 :
This meets the given requirements and does not have the side-effect of modifying the input dictionary:
dict((k,dict(v, synonym='A modern form of RTFM is: Google It.') if k == "firstCondition" else v) for k,v in SOsurvivalConditions.iteritems())
However the more concise (but statement only) way can be adapted with a helper function, e.g.:
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.'
           )
The Example:
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,
}
'firstCondition' in SOsurvivalConditions now has two key-value pairs. A new key-value pair, ('synonym', 'A modern form of RTFM is: Google It.'), needs to be appended and the result should be available in a single expression.
This works (one line, but broken into several here):
{
    'moodImperative': SOsurvivalConditions['moodImperative'],
    'firstCondition' :
        dict(
               SOsurvivalConditions['firstCondition'],
               synonym = 'A modern form of RTFM is: Google It.'
            )
}
and returns:
{'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.'
        }
 }
However there is a lot of redundancy in this expression - all keys are repeated. And 'firstCondition' appears two times. Is there a more elegant way?
(The names and the content of the datastructures here are made up, but represent a real problem I encountered today. Python version: 2.6.2.).
SOsurvivalConditions['firstCondition']['synonym'] = 'A modern form of RTM is: Google It.'
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With