将Python中的负索引转换为正索引

8
我将尝试找到一种方法,通过负索引来获取Python列表中某个项目的索引,包括索引为0。
例如,对于一个大小为4的列表l
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会自动进行访问回绕。 - swayamraina
4个回答

20

index = index取模 size

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(list),它与以下链接中的代码是相同的:https://www.w3schools.com/python/python_operators.asp - 123

3

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

index = len(l) - index - 1

计算“从后往前的索引”。

在许多其他编程语言中,您需要这样做。Python的负数索引只是语法糖。

但如果您真的使用负数索引,这个不太好的技巧可以用一行代码实现,而无需使用ifelse

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

解释:

  • 如果 negative == 0and 表达式的结果是 False,通过调用 int 转换为 0
  • 否则,and 的结果是 negative + len,详情请参见此处。然后,对 int 的调用什么也不做。

这对学习 Python 很有帮助,但我通常避免使用这种技巧。它们很难阅读,对你和其他人来说都很难理解,也许你几个月后想再次阅读代码时会想知道这行代码在做什么。


0

负索引与从长度中减去相同:

>> 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: 列表索引超出范围 - cpxn
使用三元if语句可以避免这种情况,因为else部分仅在索引小于0时进行评估,而不是等于0。 - N Chauhan
@ducminh,if语句中的条件不同。 - N Chauhan

0
你可以使用~补码运算符。它将给出所需的反向索引。
>>> l = ["a", "b", "c", "d"]
>>> l[0]
'a'
>>> l[~0]
'd'
>>> l[~3]
'a'
>>> l[~-1]
'a'
>>> l[-1]
'd'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接