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

时间:2018-08-25 11:21:37

标签: python list indexing

我正在尝试找到一种方法,以给定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开始并在列表中向后移动的索引,并希望将它们从负数转换为正数。

4 个答案:

答案 0 :(得分:6)

index =索引模大小

index = index % len(list)

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

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

答案 1 :(得分:2)

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

index = len(l) - index - 1

计算“反面的索引”。

这是您必须使用许多其他编程语言进行的方式。 Python的负索引只是语法糖。

但是,如果您真的使用负索引,那么这种肮脏的骇客就是没有ifelse的单行代码:

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

说明:

  • 如果negative == 0的{​​{1}}表达式的结果为and,则通过调用False将其转换为0
  • 否则int的结果为and,另请参见here。然后,对negative + len的调用将什么都不做。

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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