此作品:
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:
...
参考您的示例:
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]])
以下内容将以错误的语法表示错误。
如果您尝试使用pycharm,它将显示“无法解析的引用,并且不能在此处使用加星号的表达式”。
x = ['foo', 'bar']
y[*x]
AND
以下代码不会给出错误,因为您正在将[* x]分配给y。因此,print(y)有效
x = ['foo', 'bar']
y = [*x]
print(y)