在Python中,"for x, *y in list"是什么意思?

14

我最近看到一段像这样的Python代码

groups = {}
    for d, *v in dishes:
        for x in v:
            groups.setdefault(x, []).append(d)

dishes表示一个二维数组。 第一个for循环语句的意思是什么? *v是什么?星号在v之前表示什么? 在什么其他情况下会在变量之前使用星号?

2个回答

32

这实际上是元组/列表解构和 *args 可迭代解构的结合。每次循环迭代时,都会对每个可迭代对象进行解构。

首先让我们看一个简单的元组/列表解构:

>>> x, y = (1, 2)
>>> x
1
>>> y
2

# And now in the context of a loop:
>>> for x, y in [(1, 2), (3, 4)]:
>>>     print(f'x={x}, y={y}')
"x=1, y=2"
"x=3, y=4"

现在考虑以下内容(并想象上面显示的循环中相同的概念):

>>> x, y = (1, 2, 3)
ValueError: too many values to unpack (expected 2)

>>> x, *y = 1, 2, 3
>>> x
1 
>>> y 
[2, 3]

注意如何使用 * 允许 y 消耗所有剩余的参数。

这与在函数中使用 * 的方式类似 - 它允许未指定数量的参数,并将它们全部消耗。 您可以在此处查看更多 (*args) 使用示例。

>>> def foo(x, *args):
>>>     print(x)
>>>     print(args)

>>>foo(1, 2, 3, 4)
1
[2, 3, 4]

关于实际示例,这里有一个简单的例子:

>>> names = ("Jack", "Johnson", "Senior")
>>> fist_name, *surnames =  names
>>> print(surnames)
["Johnson", "Senior"]

1
非常好的答案!我想知道为什么最后一个例子被认为是不好的? - ToughMind
我原本有其他的东西。会进行编辑,谢谢! - gtalarico

1
基本上,* 表示无数个元素。
例子:
x=1,2,4,6,9,8
print(type(x))
print(x)

输出:

<class 'tuple'>
(1, 2, 4, 6, 9, 8)

y,*x=1,2,4,6,9,8
print(type(x))
print(x)

输出:

<class 'list'>
[2, 4, 6, 9, 8]

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