Python:为什么我不能将元组解包到字典中?

10
为什么这个不起作用?
d["a"], d["b"] = *("foo","bar")

有没有更好的方法来实现我想要达到的目标?

2
我从来没有想过尝试这样的事情... - mgilson
3个回答

19

如果您提前定义一个字典 d,并从中删除 *,它就会起作用:

>>> d = {}
>>> d["a"], d["b"] = ("foo","bar")

实际上,在右手边不需要那些括号,所以这样也可以工作:

>>> d['a'], d['b'] = 'foo', 'bar'

啊,你不需要那个星号。谢谢。 - jsj
@trideceth12:出于好奇,你是从哪里得到“*”这个想法的? - David Robinson
3
这绝对很酷(+1)-- [但我仍然认为d.update(a ='foo',b ='bar')更好](https://dev59.com/-m7Xa4cB1Zd3GeqPpmop#14854908) :) - mgilson
在 RHS 上也不需要 ()d['a'], d['b'] = 'foo', 'bar' - ecatmur
@DavidRobinson 我猜这可能来自 Ruby 中臭名昭著的 splat 操作符 :-) - David Unric
@DavidRobinson 你需要使用它将元组解包成函数参数。 - jsj

9

其他人已经展示了如何将内容解压缩为字典。然而,针对你的问题“是否有更好的方法”,我认为:

d.update(a='foo',b='bar')

更容易解析。诚然,如果您有ab变量,那么您可以使用:

d.update({a:'foo',b:'bar'})

我认为我仍然更喜欢以下版本,原因如下:
  • 它可以更清晰地分成多行,因此可以更好地扩展到多个(> 2)值
  • 它可以立即清楚地显示哪个键与哪个值相关联。

如果您从包含两个值的2元组开始,而不是像您展示的那样静态,您甚至可以使用zip

d.update( zip(("a","b"),("foo","bar")) )

诚然,这种方式不如其他两种选项...

... 现在我们已经介绍了使用 dict.update 的三种方式 :).


这真的很好。忘掉它吧。当值的数量增加时,至少这样不会变丑。+1 - Rohit Jain

0

这只是一个打字错误(*)。这个代码可以运行(在Python 2.7.3中测试过):

d = dict()
d["a"], d["b"] = ("foo", "bar")

1
这不是打字错误。他使用了一个与列表和args一起使用的解包运算符。在使用元组时不需要使用此运算符。 :) - Marek Marczak

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