在python中有更新的东西,以更新排序的排序?

Jor*_*ter 12 python dictionary

在python中,如果我执行以下操作:

>>> list = [ 3, 2, 1]
>>> sorted_list = k.sort()
Run Code Online (Sandbox Code Playgroud)

然后sorted_listNonelist排序:

>>> sorted_list = k.sort()
>>> print list, sorted_list
[1, 2, 3] None
Run Code Online (Sandbox Code Playgroud)

但是,如果我执行以下操作:

>>> list = [ 3, 2, 1]
>>> sorted_list = sorted(list)
Run Code Online (Sandbox Code Playgroud)

然后list保持未分类并sorted_list包含已排序列表的副本:

>>> print list, sorted_list
[3, 2, 1] [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

我想知道是否有update词典功能的等价物.

这样我可以做这样的事情:

def foo(a, b, extra={}):
    bar = { 'first': a, 'second': b }
    special_function(**updated(bar, extra))
    normal_function(**bar)
Run Code Online (Sandbox Code Playgroud)

而不是必须做这样的事情:

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)
Run Code Online (Sandbox Code Playgroud)

[1]是的我知道我可以简单地替换这两行,extra.update(bar)但我们假设我想保留原来extra的函数.

我意识到我可以自己实现这个:

def updated(old_dict, extra={}):
    new_dict = old_dict.copy()
    new_dict.update(extra)
    return new_dict
Run Code Online (Sandbox Code Playgroud)

或者以下非常难以理解的就地声明:

    special_function(**(dict(bar.items()+extra.items())))
Run Code Online (Sandbox Code Playgroud)

但我希望有一些我已经可以使用的东西.

Sve*_*ach 17

你可以简单地使用内置的dict():

updated_dict = dict(old_dict, **extra_dict)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果`extra_dict`键不是字符串,这将不起作用. (11认同)

Gan*_*aro 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'}
Run Code Online (Sandbox Code Playgroud)

否则斯文的建议就好了.

编辑:如果您使用的是Python 2.7或更高版本,您还可以使用字典理解,正如Sven在评论中所建议的那样:

def updated(*dicts):
    return {k: v for d in dicts for k, v in d.items()}
Run Code Online (Sandbox Code Playgroud)

  • 使用`sum()`进行列表连接不仅是丑陋的,它将使整个事物O(n ^ 2).如何使用类似`{k:v for d in dicts for k,v in d.items()}`? (3认同)
  • @Gandaro:`chain()`(和`chain.from_iterable()`,就此而言)都是O(n),而`sum()`版本是O(n ^ 2).对于更多的字典,`sum()`版本将变得非常慢. (2认同)