如何使用变量对Python列表进行切片?
我有一个无害的清单“我的清单”包括六项。永远不要空着,永远不要有任何讨厌的东西如何使用变量对Python列表进行切片?,python,list,python-3.x,syntax,slice,Python,List,Python 3.x,Syntax,Slice,我有一个无害的清单“我的清单”包括六项。永远不要空着,永远不要有任何讨厌的东西 mylist = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'] 我发现有两种方法可以为列表编制索引,用于切片。对于这个问题,我将它们称为上指数(从0到5)和下指数(从-1到-6)。下面是一个快速图表(我发布了一张带有颜色的照片,被另一个用户替换): 为了便于在末尾附近进行切片,我发现较低的索引很有用,例如: >>> mylist[-1:-5:-1] ['ff
mylist = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff']
我发现有两种方法可以为列表编制索引,用于切片。对于这个问题,我将它们称为上指数(从0到5)和下指数(从-1到-6)。下面是一个快速图表(我发布了一张带有颜色的照片,被另一个用户替换):
为了便于在末尾附近进行切片,我发现较低的索引很有用,例如:
>>> mylist[-1:-5:-1]
['fff', 'eee', 'ddd', 'ccc']
例如,我所说的“容易”是指不考虑代码与列表长度的关系
我了解到Python切片是“始终保留”(也称为“最多但不包括”)。在我的图表中,我将其显示为“箭头”,从切片的末尾指向前面的“下一项”(“切片的意义/方向上的“前面”)
对于我的用户,我需要显示列表中的前这么多项。(这些是递归搜索、求值和排序运行的结果。)由于此列表通常相当长,我会将其向后打印(在控制台中),以便在脚本结束时,屏幕上仍然可以看到最佳的n
结果。因此,在本文中,我的步骤是-1
我想使用变量,以满足不同用户的不同需求(以及不同的屏幕大小)对于调试和某些用户,我希望能够向后打印所有结果,即整个列表。我希望使用以下语法:
start = 5 # I only need to know "5" for debugging, normally I can use
# any small number to show a few selected items of mylist
end = x # this is my main question, see photo
mylist[start:end:-1]
我的问题是,我如何使用变量和索引的上部列表来编写图表中的第一个(最上面的)部分?或者换句话说,图表中x
(和y
)的数值是多少
我不想使用的半解决方案:
mylist[5::-1] # no variable at all
mylist[5:None:-1] # does not fit in my normal function for printing
我没有在任何简单的变量操作中使用None
,它会给我带来如下错误:
end = None - 20
TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'
我还没有把None
转换成任何整数或其他数字。有办法吗?可能是蟒蛇王国的亵渎
如果我找不到x
的密码,那么我可能需要使用此密码:
mylist[-1:-7:-1] # I want to use the upper index rather
但是这种方法需要检查mystring
的长度
end = -1 * (len(mystring)+1) # extra-explicit as an example
returns -7
mystring[-1:end:-1]
returns ['fff', 'eee', 'ddd', 'ccc', 'bbb', 'aaa'] # this is the output I want, just not the method
在问你之前我做了什么:我编写了一个测试脚本,并尝试猜测
x
。我在Stack Overflow(如)和online(如)上搜索并阅读了大量关于切片和变量的内容,我还搜索了介绍Python和学习Python等电子书
请求:请不要告诉我我想要的是错的。我可以对
mylist[0:6:1]
进行切片,尽管我的示例列表中没有索引的6
项,对于-7
也是如此。这就是为什么我有这样的预感,x
和y
也可能有数字,我可以在变量中使用它们
欢迎您告诉我,它不存在,或者不能以我希望的方式完成。在后一种情况下,我也要求你们提供尽可能接近我要求的替代方案
想要更多信息的人的背景:这个问题更多的是关于“计算出切片”,而不是关于使打印输出成为可能。我确实有解决办法,但很想了解更多。简短的回答是:没有
如果不想计算列表的长度,则必须使用
None
(尽管这是Python中的O(1)
操作):
您可以使用占位符来表示“整件事”,例如
0
:
>>> end = 3
>>> mylist[end - 1 if end else None::-1]
['ccc', 'bbb', 'aaa']
>>> end = 0
>>> mylist[end - 1 if end else None::-1]
['fff', 'eee', 'ddd', 'ccc', 'bbb', 'aaa']
你也可以考虑两个步骤,即取你想要的切片然后反转它:
>>> mylist[:3][::-1]
['ccc', 'bbb', 'aaa']
只需设置一个默认值,如果用户更改了默认值(max),则更改变量
>>> mylist = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff']
>>> display_num = len(mylist)
>>> mylist[display_num-1::-1]
['fff', 'eee', 'ddd', 'ccc', 'bbb', 'aaa']
将display_num变量更改为要显示的结果数
>>> display_num = 4
>>> mylist[display_num-1::-1]
['ddd', 'ccc', 'bbb', 'aaa']
我认为你的选择是没有或名单的长度
。。。或者只是试着抓住
>>> display_num = None
>>> try:
>>> mylist[display_num-1::-1]
>>> except TypeError:
>>> mylist[::-1]
如果我没弄错你的问题,你希望我这样做吗
mylist[2:y:-1] == ['ccc', 'bbb', 'aaa']
其中y必须是整数
您要查找的y是-len(mylist)-1
或更低的整数。如果需要常数,可以使用-sys.maxsize
(因为列表不可能大于maxsize
)
如果我们看一下CPython的源代码,我们可以看到这一点。为了完成您想要的操作,必须设置step=-1、start=2和slicelength=3 代码已经设置了start=2和step=-1。是否有y值可以导致切片长度=3?让我们看看 当步长为负时,计算切片长度的行为: 从这里,我们可以看到,为了使slicelength=(stop-start+1)/step+1=3,我们必须使stop=-1。然而:
如果(*停止<0)*停止+=长度;
如果(*停止<0)*停止=(*步骤<0)-1 : 0;
因此,如果我们提供负停止,它将增加
len(mylist)
。如果stop仍然为负值,则设置为-1,这是我们需要的值。…什么?!你是说你想要序列中的第一个n
项,顺序相反吗?为什么不seq[:n][::-1]
(即,获取第一个n
项目,然后将其反转-请注意,您可以省略一些数字,请参见示例)?你能把照片上的内容转换成真实的文字吗;前者对屏幕阅读器等用户毫无帮助。@jonrsharpe:谢谢,是的,前n项通常是,有时是所有项,总是相反。我不明白“省略一些数字”如何帮助我使用变量——我的问题不是输入更少的代码;请解释。@jonrsharpe:你有没有链接到一些语法帮助,可以让我的图表变成文本,保持对齐、颜色和箭头等。?怎么会呢
>>> display_num = 4
>>> mylist[display_num-1::-1]
['ddd', 'ccc', 'bbb', 'aaa']
>>> display_num = None
>>> try:
>>> mylist[display_num-1::-1]
>>> except TypeError:
>>> mylist[::-1]
mylist[2:y:-1] == ['ccc', 'bbb', 'aaa']
*slicelength = (*stop-*start+1)/(*step)+1;
if (*stop < 0) *stop += length;
if (*stop < 0) *stop = (*step < 0) ? -1 : 0;