【问题标题】:Is there a built-in method for checking individual list indices in Python是否有用于检查 Python 中单个列表索引的内置方法
【发布时间】:2017-07-28 02:58:55
【问题描述】:

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 序列,我会非常高兴。对于我心目中的应用来说,任何一个都将是完美的。

【问题讨论】:

  • 等等,你想要一个元组还是一个数组?很难说。
  • @user2357112。最终结果是一个元组。它将用于在数组中创建索引,因此我愿意查看仅用于执行索引检查的数组方法。
  • @RajanChauhan。我不确定我是否理解这与远程相关。
  • 您不想通过中间列表的任何特殊原因?这对我来说似乎很好,it's faster.

标签: python numpy slice


【解决方案1】:

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

如果您有大量索引要并行执行此操作,可能使用 Numpy 矢量化算法进行计算可以获得更好的性能,但我不认为 range 的技术在这种情况下会起作用。您必须使用问题中的实现手动进行计算。

【讨论】:

  • 就我想要的而言:r = range(4); a = r[a]; items = tuple('item' if i == a else None for i in r)。一点也不差。为了以防万一,我会等一会儿再选择。
  • @MadPhysicist 顺便说一句,如果你真的想这样做,我想知道tuple([None] * a + ['item'] + [None] * (length - a - 1)) 这样的东西是否会更有效......因为我没有测试过,所以不确定,但可能值得一试。
  • 并非如此,因为您最终会创建一堆中间列表。我还创建了几个这样的索引,以便范围和 a 都得到重用。
  • 在旧版本中,您只需使用xrange 而不是范围。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 2021-08-22
    • 2013-03-19
    • 2020-01-17
    • 2013-11-03
    相关资源
    最近更新 更多