为什么列表索引[-4:0]在[0:4]工作时不起作用?

时间:2018-12-22 11:14:54

标签: python python-3.x list

如果否定列表索引从列表的末尾开始,则假设我们拥有:

l = [1,2,3,4,5]

l[0:3]l[:3]返回相同的值,而l[-3:0]返回一个空列表,而l[-3:]返回[3,4,5]

不允许list[-x:0]返回列表的背后逻辑是什么?

4 个答案:

答案 0 :(得分:2)

l[-3:0]尝试从3到0的范围进行切分-与l[2:0] ..相同,因为第一个值>第二个值没有切分。

l[-3:]可以读作l[-3:len(l)]-因此l[2:5]会返回切片。

您需要l[-3:0:-1]才能正常工作-但这很令人讨厌,我试图避免切片。 (print( [1,2,3,4,5][-3:0:-1]-> [3, 2]),因为它还会将切片“方向”反转为向后而不是向前

l[-3:]从后面的3片切到结尾。

答案 1 :(得分:1)

Python中slice的完整符号如下:

s[start:end:step]

话虽如此,它根据documentation为值提供了有用的默认值

  

切片索引具有有用的默认值;省略的第一索引默认为   零,省略的第二个索引默认为字符串的大小   切成薄片。

因此,当您执行以下操作时:

s[1:]

此操作已完成:

s[1:len(s)]

请注意,在两种情况下, step 均默认为1。在大多数语言中,例如,当您想访问列表的最后一个元素时,您可以执行以下操作:

s[len(s) - 1]

Python负索引是在该表示法上的语法糖的一种,因此:

l[-1] = l[len(l) - 1]
l[-2] = l[len(l) - 2]
...

然后在您这样做时:

l[-3:]

这完成了:

l[len(l)-3:len(l)]

因此,应该使用0作为最后的索引,而不是len(l)

l = [1, 2, 3, 4, 5]
print(l[-3:len(l)])

输出

[3, 4, 5]

请注意,l[-3:0]返回空列表是因为len(l) - 3 > 0,即第一个索引大于第二个索引,并且 step 1

进一步

  1. Understanding Python's slice notation

答案 2 :(得分:0)

前面的 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/jesta_bottom_navigation" style="@style/Widget.Jesta.BottomNavigationView" android:layout_width="match_parent" android:layout_height="@dimen/bottom_bar" android:layout_gravity="bottom" app:itemIconSize="30dp" app:itemIconTint="@drawable/jesta_bottom_navigation_colors" app:labelVisibilityMode="unlabeled" app:menu="@menu/bottom_nav_drawer_menu" /> </FrameLayout> 起作用了,但是最后……行不通了,与此相同:

0

因为python最后想的是零...

所以这实际上等同于:

>>> l=[1,2,3,4,5]
>>> l[2:0]
[]
>>> 

因为第一个元素之前当然没有东西,如果有的话,那个东西就不会是第一个元素,而是第二个。

答案 3 :(得分:0)

负索引从列表的末尾开始操作。 假设您要获取最后3件商品,可以这样做:

# Reversing and restoring the order
my_list = [1,2,3,4,5,6]
print(reversed(reversed(my_list)[:3]))

# Subtracting from the size
size = len(my_list)
print(my_list[size-3:])

但是您可以键入

my_list[-3:]

用言语表述的是让我从列表末尾的第三项开始获得列表的一部分

所以您必须知道您的要求。

# Slice from the x'th element at the end till the end of the list
my_list[-x:]

# Slice from the x'th element at the end till the y'th element at the end of the list
my_list[-x:-y]

# Slice from the x'th element at the end till the y'th element from the start of the list. 
# Only valid if len(my_list) - y < x and y > 0
my_list[-x:y]