我正在尝试找到一种方法,以给定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开始并在列表中向后移动的索引,并希望将它们从负数转换为正数。
答案 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的负索引只是语法糖。
但是,如果您真的使用负索引,那么这种肮脏的骇客就是没有if
和else
的单行代码:
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'