在python中如果我执行以下操作:
>>> list = [ 3, 2, 1]
>>> sorted_list = k.sort()
然后sorted_list
为None
,list
已排序:
>>> sorted_list = k.sort()
>>> print list, sorted_list
[1, 2, 3] None
但是,如果我执行以下操作:
>>> list = [ 3, 2, 1]
>>> sorted_list = sorted(list)
然后list
仍未排序,sorted_list
包含已排序列表的副本:
>>> print list, sorted_list
[3, 2, 1] [1, 2, 3]
我想知道是否有词典update
函数的等价物。
这样我可以这样做:
def foo(a, b, extra={}):
bar = { 'first': a, 'second': b }
special_function(**updated(bar, extra))
normal_function(**bar)
而不是做这样的事情:
def foo(a, b, extra={}):
bar = { 'first': a, 'second': b }
special_bar = bar.copy()
special_bar.update(extra) # [1]
special_function(**special_bar)
normal_function(**bar)
[1]是的我知道我可以简单地用extra.update(bar)
替换这两行,但我们假设我想保留extra
,以便稍后在函数中使用。
我意识到我可以自己实现这一点:
def updated(old_dict, extra={}):
new_dict = old_dict.copy()
new_dict.update(extra)
return new_dict
或以下非常难以理解的就地声明:
special_function(**(dict(bar.items()+extra.items())))
但是我希望有一些我已经可以使用的东西。
答案 0 :(得分:17)
您只需使用内置的dict()
:
updated_dict = dict(old_dict, **extra_dict)
答案 1 :(得分:6)
如果你需要非字符串键,你可以使用这样的函数:(它不像你的“就地”表达式那样丑陋+它适用于任意数量的字典)
from itertools import chain # ← credits go to Niklas B.
def updated(*dicts):
return dict(chain(*map(dict.items, dicts)))
updated({42: 'the answer'}, {1337: 'elite'}) # {42: 'the answer', 1337: 'elite'}
否则斯文的建议就好了。
编辑:如果您使用的是Python 2.7或更高版本,您还可以使用字典理解,正如Sven在评论中所建议的那样:
def updated(*dicts):
return {k: v for d in dicts for k, v in d.items()}
答案 2 :(得分:4)
我真的没有看到使用两行有什么问题,就像你一样:
new_bar = bar.copy()
new_bar.update(extra)
它干净且易读。
>>> d = {1:2, 3:4}
>>> e = {3:9, 5:25}
>>> f = d.copy()
>>> f.update(e)
>>> d
{1: 2, 3: 4}
>>> f
{1: 2, 3: 9, 5: 25}
>>> e
{3: 9, 5: 25}
用三个词来说:Zen of Python。
更清楚:我的观点是,我不会用updated()
函数替换这两行,而这些函数不是来自标准库。
如果我偶然发现一行代码:
new_bar = updated(bar, extra)
我 跟踪该功能以查看其功能。我无法相信它并不奇怪。
OP也将其与sorted()
进行了比较,但是sorted()
有它存在的理由,它会对可迭代的所有内容起作用,并使用惊人的时间序列来实现。相反,假设updated()
的行为应该是什么?那应该是dict
类方法吗?目前还不清楚恕我直言。
说这样可以选择OP两行,或者Sven的解决方案,或者dict理解/生成器表达,我认为这只是一个品味问题。