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. 这就是为什么我有这样的预感,可能也有数字x,y我可以在我的变量中使用它们。
欢迎您告诉我它不存在或不能按照我希望的方式完成。在后一种情况下,我还要求您提供尽可能接近我的要求的替代方案。
对于那些想要更多信息的人来说:
这个问题更多的是关于“弄清楚切片”而不是使打印输出成为可能。我确实有解决方法,但很想了解更多。
最简洁的答案是不。
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)
| 归档时间: |
|
| 查看次数: |
2229 次 |
| 最近记录: |