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

时间:2012-02-28 16:46:35

标签: python dictionary

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

>>> list = [ 3, 2, 1]
>>> sorted_list = k.sort()

然后sorted_listNonelist已排序:

>>> 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())))

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

3 个答案:

答案 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理解/生成器表达,我认为这只是一个品味问题。