是否可以在单个链表达式中复制和更新python字典?

时间:2015-11-06 22:03:27

标签: python dictionary

请考虑以下事项:

x = {1:2}
y = x.copy() # returns a new dictionary
y = x.copy().update({2:3}) # returns None
y = x.copy()[2] = 3 # invalid syntax

鉴于上述工作都没有,是否有办法将命令链接到Dict.copy()以在单个命令中复制和更新字典?

4 个答案:

答案 0 :(得分:8)

是的,您可以使用dict() function创建副本并添加关键字参数;使用**{...}添加非Python标识符的任意键:

y = dict(x, **{2: 3})

对于恰好是有效Python标识符的字符串键(以字母开头,仅包含字母,数字和下划线),请使用dict()的关键字参数:

y = dict(x, foo_bar='spam_eggs')

您可以组合这两种样式,并添加更多键:

y = dict(x, foo='spam', bar='eggs', **{2: 3, 42: 81})

演示:

>>> x = {1: 2}
>>> dict(x, **{2: 3})
{1: 2, 2: 3}
>>> dict(x, foo_bar='spam_eggs')
{1: 2, 'foo_bar': 'spam_eggs'}
>>> dict(x, foo='spam', bar='eggs', **{2: 3, 42: 81})
{1: 2, 2: 3, 'foo': 'spam', 'bar': 'eggs', 42: 81}
>>> x  # not changed, copies were made
{1: 2}

答案 1 :(得分:3)

在Python 2中,您可以使用:

y = dict(x.items()+{2:3}.items())

或:

y = dict(x.items()+[(2, 3)])

答案 2 :(得分:3)

你可以使用dict理解:

y = {
    k:v
    for dct in ( x, {2:3} )
    for k,v in dct.items()
}

答案 3 :(得分:0)

这个例子的问题在于你正在处理" x.copy()"就像每次使用它时它是同一个实例,但事实并非如此。每次调用" x.copy()"创建" x"。

的新副本
x = {1:2}
y = x.copy() # first new copy, saved as "y"
y = x.copy().update({2:3}) # a second new copy, which is not saved because the 
                           # result of the update() method (which is None) is saved
y = x.copy()[2] = 3 # A third new copy is created, but it's the same as the
                    # original x, and has no key value of "2"

我尝试使用lambda函数提出一个内衬,但我认为这比仅仅说

更难听
y = x.copy(); y.update({2:3})