如何使用变量来切片 Python 列表?

Mar*_*ske 2 python syntax list slice python-3.x

我有一个包含六个项目的无害列表“mylist”。永远不会空着,永远不会有任何野兽般的物品。

mylist = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff']
Run Code Online (Sandbox Code Playgroud)

我发现有两种方法可以为列表建立索引以进行切片。对于这个问题,我将它们称为上索引(从0到5)下索引(从-1到-6)。这是一个快速图表(我发布了一张带有颜色的照片,已被另一个用户替换):

 <<<<|_________mylist[5:?:-1]_____________|

     |___mylist[0:3:1]______|>>>>>>
 ?
(x)   0      1      2      3      4      5     (6)

     aaa    bbb    ccc    ddd    eee    fff

(-7) -6     -5     -4     -3     -2     -1     (y)
                                                ?
             <<<<<<|___mylist[-1:-5:-1]___|

     |______mylist[-6:?:1]________________|>>>>>
Run Code Online (Sandbox Code Playgroud)

为了轻松地在列表的开头进行切片,我可以使用上面的索引,如下所示:

>>> mylist[0:3:1]
['aaa', 'bbb', 'ccc']
Run Code Online (Sandbox Code Playgroud)

为了在接近末尾时轻松切片,我发现较低的索引很有帮助,例如:

>>> mylist[-1:-5:-1]
['fff', 'eee', 'ddd', 'ccc']
Run Code Online (Sandbox Code Playgroud)

我所说的“轻松”是指不关心我的代码与列表长度的方面。

我了解到 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]
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何通过使用变量和上面的索引列表来编写图中的第一个(最上面的)切片?或者换句话说,图中(和的数值是多少?xy

我不想使用的半解决方案:

mylist[5::-1]       # no variable at all

mylist[5:None:-1]   # does not fit in my normal function for printing
Run Code Online (Sandbox Code Playgroud)

我还没有成功地在任何简单的操作中使用None我的变量,它给了我这样的错误:

    end = None - 20 
TypeError: unsupported operand type(s) for -: 'NoneType' and 'int'
Run Code Online (Sandbox Code Playgroud)

我还没有设法转换None为任何整数或其他数字。有办法吗?在Pythonland中可能是一种亵渎......

如果我找不到 的秘密号码x,那么我可能需要使用以下方法:

mylist[-1:-7:-1]  # I want to use the upper index rather
Run Code Online (Sandbox Code Playgroud)

但这种方法涉及检查 的长度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
Run Code Online (Sandbox Code Playgroud)

在问你之前我做了什么:
我已经编写了一个测试脚本并尝试猜测x。我在 Stack Overflow 上搜索并阅读了大量有关切片和变量的内容(例如, 当在 Python 中使用负数来切片字符串时,0 被禁用?)和在线(例如https://docs.python.org/3/library ) /functions.html?highlight=slice#slice),我搜索了《Python 简介》和《学习 Python》等电子书。

恳求:
请不要告诉我我想要的东西是错误的。mylist[0:6:1]尽管我的示例列表中没有索引项目,但我可以切片,6对于-7. 这就是为什么我有这样的预感,可能也有数字xy我可以在我的变量中使用它们。

欢迎您告诉我它不存在或不能按照我希望的方式完成。在后一种情况下,我还要求您提供尽可能接近我的要求的替代方案。

对于那些想要更多信息的人来说:
这个问题更多的是关于“弄清楚切片”而不是使打印输出成为可能。我确实有解决方法,但很想了解更多。

jon*_*rpe 5

最简洁的答案是


None如果你不想计算列表的长度,你必须使用(尽管这是O(1)Python中的一个操作):

>>> mylist = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff']
>>> mylist[2:None:-1]  # first 3 items backwards (note off-by-one indexing)
['ccc', 'bbb', 'aaa']
>>> mylist[None:None:-1]  # all items backwards
['fff', 'eee', 'ddd', 'ccc', 'bbb', 'aaa']
Run Code Online (Sandbox Code Playgroud)

可以使用占位符来表示“整个事情”,例如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']
Run Code Online (Sandbox Code Playgroud)

您还可以考虑两个步骤,即取出您想要的切片然后反转它:

>>> mylist[:3][::-1]
['ccc', 'bbb', 'aaa']
Run Code Online (Sandbox Code Playgroud)