Extended slice that goes to beginning of sequence with negative stride
当我解释我的问题时,请忍受。如果已经了解扩展切片列表索引,请跳到粗体标题。
在Python中,可以使用切片表示法对列表进行索引。下面是一个例子:
1 2 3 | >>> A = list(range(10)) >>> A[0:5] [0, 1, 2, 3, 4] |
您还可以包括一个步幅,其作用类似于一个"步骤":
1 2 | >>> A[0:5:2] [0, 2, 4] |
步幅也可以是负数,这意味着元素的检索顺序是相反的:
1 2 | >>> A[5:0:-1] [5, 4, 3, 2, 1] |
但是等等!我想去看埃多克斯。哦,我明白了,我需要减少开始和结束指数:
1 2 | >>> A[4:-1:-1] [] |
发生什么事了?它将-1解释为在数组的末尾,而不是开始。我知道你可以做到以下几点:
1 2 | >>> A[4::-1] [4, 3, 2, 1, 0] |
但你不能在任何情况下都使用它。例如,在已传递索引的方法中。
我的问题是:有没有什么好的Python式的方法可以使用带有负步幅的扩展切片,以及包含序列第一个元素的明确的开始和结束索引?
这是我到目前为止想出来的,但似乎不令人满意。
1 2 | >>> A[0:5][::-1] [4, 3, 2, 1, 0] |
它是易错的、语义的变化,
1 2 | >>> a = range(10) >>> start, stop, step = 4, None, -1 |
或
1 2 3 | >>> start, stop, step = 4, -(len(a) + 1), -1 >>> a[start:stop:step] [4, 3, 2, 1, 0] |
或
1 2 3 | >>> s = slice(start, stop, step) >>> a[s] [4, 3, 2, 1, 0] |
当
If
i orj is negative, the index is relative to the end of the string:
len(s) + i orlen(s) + j is substituted. But note that-0 is still0 .
这是为什么,因为它是到
1 | [ A[b] for b in range(end,start,stride) ] |
慢,但你可以使用负指数,所以这应该工作。
1 | [ A[b] for b in range(9, -1, -1) ] |
这是不是可以用一片,但我想我的解决方案是使用切片,反正如果得到的结果是不是优先。
好的,我认为这是可能的,我会得到它的好。感谢的是abgan火花型思维。这relies在事实上没有在层是处理它的参数,如果是失踪。任何人有什么好的?
1 2 | def getReversedList(aList, end, start, step): return aList[end:start if start!=-1 else None:step] |
编辑:检查是不是
这仍然是不理想的,因为你的行为clobbering通常为-1。它似乎是一个问题的两个定义:在什么是应该发生的。谁要带走,否则invocations WINS在寻找其他有效的数据。
你说的非常少的人完全了解一切,你可以用扩展的切片,所以除非你真的需要额外的性能,我是"明显的"方式:
rev_subset = reversed(data[start:stop])
But you can't use that if you are
storing your indices in variables for
example.
这是不满意吗?
1 2 3 4 5 | >>> a = range(10) >>> start = 0 >>> end = 4 >>> a[4:start-1 if start > 0 else None:-1] [4, 3, 2, 1, 0] |
我相信你不是satisfy以下:
1 2 3 4 | def getReversedList(aList, end, start, step): if step < 0 and start == 0: return aList[end::step] return aList[end:start:step] |
或吗?:-)
你可以使用
1 2 | s=slice(start, stop, step) print a[s] |
的是相同的
1 | print a[start : stop : step] |
和,此外,你可以设置到任何的参数表明,在不到
我知道这是一个老问题,但有人喜欢我的情况是:寻找答案
1 2 3 4 5 | >>> A[5-1::-1] [4, 3, 2, 1, 0] >>> A[4:1:-1] [4, 3, 2] |
1 | a[4::-1] |
例子:
1 2 3 4 5 6 7 8 9 10 11 | Python 2.6 (r26:66714, Dec 4 2008, 11:34:15) [GCC 4.0.1 (Apple Inc. build 5488)] on darwin Type"help","copyright","credits" or"license" for more information. >>> a = list(range(10)) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> a[4:0:-1] [4, 3, 2, 1] >>> a[4::-1] [4, 3, 2, 1, 0] >>> |
第二个原因是,长期的",而不是interpreted指数= =。离开它,是"在索引范围"。