解包列表/元组的前两个元素

85
有没有一种在Python中可以像这样做的方法:
a, b, = 1, 3, 4, 5

然后:

>>> a
1
>>> b
3
上述代码无法正常运行,因为它会抛出“ValueError: too many values to unpack”的错误。

在Python2还是Python3中?请相应地进行标记。假设是Python2。 - smci
5个回答

152

补充一下Nolen的回答,在Python 3中,你也可以这样解包剩余的部分:

>>> a, b, *rest = 1, 2, 3, 4, 5, 6, 7
>>> a
1
>>> rest
[3, 4, 5, 6, 7]

不幸的是,这在Python 2中不起作用。


15
好的,请让我知道需要翻译的内容。 - Jack
@Jack 为什么 *_*rest 更好? - Kenly
现在似乎没人会在意它在Python 2上不起作用 :P - undefined

70

按照你所展示的文字,无法实现它。但你可以使用切片来达到想要的效果:

a, b = [1, 3, 4, 5, 6][:2]

获取列表中的前两个值:

a, b = my_list[:2]

1
尽管原帖已经提到了这一点,但它似乎已经被编辑掉了,所以+1。 - jamylak

37

在Python 3中,您可以执行以下操作:

>>> a, b, *_ = 1, 3, 4, 5
>>> a
1
>>> b
3

_ 只是一个占位符,用于你不需要的值。


6
你可以使用_来代表你想要“扔掉”的变量。
>>> a, b, _ = 1, 3, 4
>>> a
1
>>> b
3

2
谢谢!但是当有更多元素时,它不会起作用,例如a,b,_ = 1,3,4,5 - Hanfei Sun
1
@Firegun 你说得对,你需要做类似于 a, b, _, _ = 1, 3, 4, 5 这样的事情,这很快就会变得丑陋。老实说,我认为只需获取一个列表并使用 [:2] 更有意义,也更符合 Python 的风格。 - Nolen Royalty
1
如果你获取的不是一个显式的切片,比如(x,_,z,h) = coord而不是(x,z,h) = coord[:1]+coord[2:],那么这种方法效果很好。对于更大的元组,你最终会得到像(_,_,c,_,e,f,_) = something这样的东西,这可能比混乱的索引访问要好一些。 - Zoey Hewll

4

或者在Python 3.x中,您可以这样做:

  a, *b = 1, 3, 4

为您提供:

In [15]: a
Out[15]: 1

In [16]: b
Out[16]: [3, 4]

这样做可以避免异常,但你需要解析b。这个假设是你只想在=的左边只有两个变量,否则你可以使用其他方式。

a, b, *ignore = ....

使用v3.x版本


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