索引时元组拆包

问题描述 投票:-1回答:2

此作品:

x = ['foo', 'bar']
y = [*x]
print(y)  # prints ['foo', 'bar']

但这不是:

x = ['foo', 'bar']
y[*x]  # raises SyntaxError (not NameError!)

如何在建立索引时解开元组?

[这是我想使用这种方法的两个示例,但是我更感兴趣地理解为什么在一般的索引编制中似乎不支持*-拆包。

import numpy as np

def lookup(a: np.ndarray, coordinates: tuple) -> float:
    return a[*coordinates]

a1 = np.zeros((2, 2))
print(lookup(a1, (0, 1))  # Should print 0

a2 = np.zeros(2, 2, 2))
print(lookup(a2, (0, 0, 1))  # Should print 0

from typing import Tuple

NUM_DIMENSIONS = 2  # Might change at a later point in time

# Should be equivalent to Tuple[float ,float]
Result = Tuple[*([float] * NUM_DIMENSIONS)]

def get() -> Result:
    ...
python iterable-unpacking
2个回答
0
投票

参考您的示例:

import numpy as np

def lookup(a: np.ndarray, coordinates: tuple) -> float:
    return a[*coordinates]

a1 = np.zeros((2, 2))
print(lookup(a1, (0, 1))

a2 = np.zeros(2, 2, 2))
print(lookup(a2, (0, 0, 1))

NumPy已经接受像a[coordinates]这样的索引,其中coordinates是一个元组,不需要使用star运算符:

>>> a = np.arange(8).reshape(2, 2, 2)
>>> a[(1, 1, 0)]
6

如果您使用列表编制索引,则会获得另一种有用的行为:

>> a[[1, 1, 0], [0]]
array([[4, 5],
       [4, 5],
       [0, 1]])


-1
投票

以下内容将以错误的语法表示错误。

如果您尝试使用pycharm,它将显示“无法解析的引用,并且不能在此处使用加星号的表达式”。

x = ['foo', 'bar']
y[*x]

AND

以下代码不会给出错误,因为您正在将[* x]分配给y。因此,print(y)有效

x = ['foo', 'bar']
y = [*x]
print(y)
© www.soinside.com 2019 - 2024. All rights reserved.