【问题标题】:Convert negative index in Python to positive index将Python中的负索引转换为正索引
【发布时间】:2019-01-31 15:55:03
【问题描述】:

我正在尝试找到一种方法来获取 Python 列表中某个项目的索引,因为它的负索引包括索引 0。

以列表为例,l 大小为 4:

l[0]  # index 0
l[-1] # index 3
l[-2] # index 2

我尝试过使用

index = negative + len(l)

但是,当索引为 0 时,这将不起作用。

到目前为止,我发现的唯一方法是使用 if/else 声明。

 index = 0 if negative == 0 else negative + len(l)

有没有一种可能的方法可以在 Python 中执行此操作而无需使用 if 语句?

我正在尝试存储项目的索引,以便以后可以访问它,但是我得到的索引从 0 开始并在列表中向后移动,并且希望将它们从负数转换为正数。

【问题讨论】:

  • 您只想将索引转换为正数吗?如果你想访问数组,python 会自己做访问翻转

标签: python list indexing


【解决方案1】:

索引 = 索引模大小

index = index % len(list)

对于大小为 4 的列表,对于给定的索引,它将具有以下值:

 4 -> 0
 3 -> 3
 2 -> 2
 1 -> 1 
 0 -> 0
-1 -> 3
-2 -> 2
-3 -> 1
-4 -> 0

【讨论】:

【解决方案2】:

如果您尝试从非负索引开始“返回”,您也可以使用

index = len(l) - index - 1

从后面计算“索引”。

这就是您在许多其他编程语言中必须做到的方式。 Python 的负索引只是语法糖。

但如果你真的使用负索引,这个肮脏的黑客是没有ifelse的单行:

index = int(negative != 0 and negative + len(l))

解释:

  • 如果negative == 0and 表达式的结果是False,通过调用int 转换为0
  • 否则and 的结果是negative + len,另见here。对int 的调用则什么都不做。

这对学习 Python 很有好处,但我通常会避免这些技巧。它们对您和其他人来说很难阅读,也许您想在几个月后再次阅读您的程序,然后您会想知道这行代码在做什么。

【讨论】:

    【解决方案3】:

    您可以使用~ 补码运算符。它会根据需要为您提供反向索引。

    >>> l = ["a", "b", "c", "d"]
    >>> l[0]
    'a'
    >>> l[~0]
    'd'
    >>> l[~3]
    'a'
    >>> l[~-1]
    'a'
    >>> l[-1]
    'd'
    

    【讨论】:

      【解决方案4】:

      负索引与长度减法相同:

      >> lst = [1, 2, 3]
      >> lst[-1] == lst[len(lst) - 1]
      True
      

      所以你可以用一个小的 if 语句得到一个始终为正的值:

      i = -2
      index = i if number >= 0 else len(lst) - i 
      

      事实上,如果长度大于列表的长度,您可以使用模数使索引回绕回 0:

      # assuming length of list is 4
      index = i % len(list)
      
      # with i at 0:
      0 % 4 == 0 # that works
      
      # with i as -2
      -2 % 4 == 2 # that works
      
      # with i as 3:
      3 % 4 == 3 % # that works
      

      【讨论】:

      • 是的,但是我的问题是索引为 0:lst[0] == lst[len(lst) - 0]IndexError: list index out of range
      • 使用三元 if 语句可以避免这种情况,因为 else 部分仅评估索引是否小于小于 0,而不是 0 本身
      • @ducminh if 语句中的条件不同
      猜你喜欢
      • 1970-01-01
      • 2014-02-04
      • 2018-07-09
      • 1970-01-01
      • 2019-03-03
      • 2011-12-03
      • 2021-08-28
      • 2021-06-09
      • 2016-01-25
      相关资源
      最近更新 更多