字典无法用字符串作为键更新

4
我正在尝试使用返回元组的函数更新字典,其中第一个元素是字符串。
>>> def t():
...     return 'ABC', 123

然而,dict.update函数并不太喜欢这样做。

>>> d = {}
>>> d.update(t())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: dictionary update sequence element #0 has length 3; 2 is required

我也可以尝试使用字典推导式并获得相同的意外结果。

>>> d.update({k: v for k, v in t()})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <dictcomp>
ValueError: too many values to unpack (expected 2)

唯一有效的方法是首先保存返回值。
>>> x = t()
>>> d.update({x[0]: x[1]})
>>> d
{'ABC': 123}

如何解释这个问题?
3个回答

5

来自文档

update() 接受另一个字典对象或键值对的可迭代对象(例如元组或长度为二的其他可迭代对象)。如果指定了关键字参数,则使用这些键值对更新字典:d.update(red=1, blue=2)

例如:

In [1]: d = {}

In [2]: def t(): return [('ABC', '123')]

In [3]: d.update(t())

In [4]: d
Out[4]: {'ABC': '123'}

In [5]: d2 = {}

In [6]: def t2(): return {'ABC': '123'}

In [7]: d2.update(t2())

In [8]: d2
Out[8]: {'ABC': '123'}

我的误解来自于一个长度为2的可迭代对象(即(a, b))可以使用。而实际上,update函数需要一个长度为2的可迭代对象的可迭代对象(即[(a, b)])。 - Spack

1

@杰克的回答是正确的。

在你的两个失败示例中,你使用了一对而不是一系列的配对

另外,为了增加一些调味料,这里还有两种方法来实现它:

def t():
    return 'ABC', 123
d = {}
d.update([ t() ])
d
=> {'ABC': 123}
d = {}
d.__setitem__(*t())
d
=> {'ABC': 123}

1
更简单的方法是将t()更改为返回一个{key: value},如下所示:

def t():
    return {'ABC': 123}

这应该对你有帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接