2013-03-23 59 views
1

考虑下面的代码:功能python列表切片真的不对称吗?

>>> a = [0, 1, 2] 
>>> for i in range(len(a)): 
>>> print a[0:i] 

[] 
[0] 
[0, 1] 

然而,当我翻转代码,以切片从列表中的另一端,它不再起作用:

>>> for i in range(len(a)): 
>>> print a[-i:] 

[0, 1, 2] 
[2] 
[1, 2] 

只有这样,才能使第二件作品的代码似乎是颠倒清单,以第一种方式做,并在打印之前将每件作品颠倒过来。有一个更好的方法吗?我有时使用这种类型的循环,我希望我的代码尽可能干净。

编辑:在两个循环中,我从左到右迭代。如果我翻转迭代的方向以及第二个循环,它也可以工作。如果我翻转迭代的方向,为第一环,它也有同样的打嗝的第二环:

>>> for i in range(len(a)): 
>>> print a[i-1::-1] 

[2, 1, 0] 
[0] 
[1, 0] 

回答

8

第一次迭代,你是切片为-0,这是一样的从0切片。只有第二次迭代才会分为-1,然后-2

也许你可以在负指数使用范围开始:

for i in range(-len(a), 0): 
    print a[-i:] 
+3

Arg - 您什么时候出现在这里?现在我该怎么去FGITW什么? (+1 btw) – mgilson 2013-03-23 23:03:52

+0

他藏在阴影里。 xD – TerryA 2013-03-23 23:04:04

+0

绝对不能相信毛毡娃娃忍者.. – 2013-03-23 23:04:32

0

反切片不可能完全对称的Python因为基于0的索引。具体来说,不可能将-0与0区分开来。但是基于0的索引数组中的对称访问用例将决定如果第0项从左边开始第一项,则第-0项(即,负0)是第一个从右边开始的,但由于0和-0是同一个实体,这就产生了一个问题。

考虑名单的指数的两个方向:

转发:第一项是在位置0,第二个项目在位置1,...,最后一个项目位置n-1

向后:第一项是在-1位置,第二在-2,...,在位置的最后一个项目-n

负指数表示法因此,对于(长度索引)一个速记collection[-i] == collection[len(collection) - i]

或者,并排,索引是:

[0, 1, 2,...,n-1] 
[-n,..., -3, -2, -1 ] 

当上述两个指标的实际上是相同的。

要执行对称操作时,你的切片操作者需要正确地解释这种索引方案:

原始切片a[0:i] ==从左端i个元素(从0),用1 ==步长a[0:i:1]

反向切片:i个元素从右端(在-1)的-1步长。

因此,从另一端的正确片会a[-1:-1-i:-1]

注意,这里的停止值是我的消极,-1偏移占-1型反转索引,它是必要的,因为我们正在生成使用基于前向的列表(例如范围函数)。

a = range(3) # [0,1,2] 
for i in range(len(a)): 
    # forward case, next to backward case 
    print a[:i], a[-1:-1-i:-1] 
# [] [] 
# [0] [2] 
# [0, 1] [2, 1]