是否有内置的方法来检查Python中的单个列表索引

时间:2017-07-28 02:58:55

标签: python numpy slice

Python具有内置功能,可用于检查整个切片的有效性:slice.indices。个别指数内置了类似的内容吗?

具体来说,我有一个索引,比如a = -2,我希望对4元素列表进行规范化。是否有一种方法等同于已经内置的以下方法?

def check_index(index, length):
    if index < 0:
        index += length
    if index < 0 or index >= length:
        raise IndexError(...)

我的最终结果是能够构造一个具有单个非None元素的元组。我目前正在使用list.__getitem__为我做检查,但它似乎有点尴尬/矫枉过正:

items = [None] * 4
items[a] = 'item'
items = tuple(items)

我希望能够做到

a = check_index(a, 4)
items = tuple('item' if i == a else None for i in range(4))

这个例子中的所有内容都很容易协商。唯一能解决的问题是我得到a的方式可以包含任意索引可能存在的所有问题,最终结果必须是tuple

如果解决方案使用numpy并且仅真正应用于numpy数组而不是Python序列,我会非常高兴。任何一个都适合我想到的应用程序。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您可以在示例range(length)[index]中使用range(4)[-2]。这可以正确处理负数和越界指数。至少在Python的最新版本中,range()并没有真正创建一个完整的列表,所以即使对于大型参数,这也会有不错的表现。

如果您有大量索引并行执行此操作,那么可能在使用Numpy矢量化算法进行计算时可以获得更好的性能,但我不认为该技术有{ {1}}将适用于该案例。您必须使用问题中的实现手动执行计算。

答案 1 :(得分:2)

有一个名为numpy.core.multiarray.normalize_axis_index的函数可以完全满足我的需要。它特别有用,因为我想到的实现是numpy数组索引:

from numpy.core.multiarray import normalize_axis_index

>>> normalize_axis_index(3, 4)
3
>>> normalize_axis_index(-3, 4)
1
>>> normalize_axis_index(-5, 4)
...
numpy.core._internal.AxisError: axis -5 is out of bounds for array of dimension 4

该功能已在1.13.0版本中添加。此功能的来源可用here,文档来源为here