Python的切片表示法是如何工作的?也就是说:当我编写[x:y:z]、a[:]、a]::2]等代码时,我如何理解哪些元素最终会出现在切片中?请在适当的地方附上参考资料。
另请参见:为什么切片和范围上限是互斥的?
Python的切片表示法是如何工作的?也就是说:当我编写[x:y:z]、a[:]、a]::2]等代码时,我如何理解哪些元素最终会出现在切片中?请在适当的地方附上参考资料。
另请参见:为什么切片和范围上限是互斥的?
当前回答
Index:
------------>
0 1 2 3 4
+---+---+---+---+---+
| a | b | c | d | e |
+---+---+---+---+---+
0 -4 -3 -2 -1
<------------
Slice:
<---------------|
|--------------->
: 1 2 3 4 :
+---+---+---+---+---+
| a | b | c | d | e |
+---+---+---+---+---+
: -4 -3 -2 -1 :
|--------------->
<---------------|
我希望这将帮助您用Python建模列表。
参考:http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
其他回答
如果我们可以将切片与范围联系起来,这很容易理解,因为范围给出了索引。我们可以将切片分为以下两类:
1.无台阶或台阶>0。例如,[i:j]或[i:j:k](k>0)
假设序列为s=[1,2,3,4,5]。
如果0<i<len(s)和0<j<len,则[i:j:k]->范围(i,j,k)
例如,[0:3:2]->范围(0,3,2)->0,2
如果i>len或j>len,则i=len或j=len
例如,[0:100:2]->范围(0,len(s),2)->范围(0,5,2)->0,2,4
如果i<0或j<0,则i=max(0,len(s)+i)或j=max
例如,[0:-3:2]->范围(0,len(s)-3,2)->范围(0,2,2)->0
例如,[0:-1:2]->范围(0,len(s)-1,2)->范围(0,4,2)->0,2
如果未指定i,则i=0
例如,[:4:2]->范围(0,4,2)->范围(4,2)->0,2
如果未指定j,则j=len(s)
例如,[0::2]->范围(0,len(s),2)->范围(0,5,2)->0,2,4
2.步骤<0。例如,[i:j:k](k<0)
假设序列为s=[1,2,3,4,5]。
如果0<i<len(s)和0<j<len,则[i:j:k]->范围(i,j,k)
例如,[5:0:-2]->范围(5,0,-2)->5,3,1
如果i>len或j>len,则i=len(s)-1或j=len(s)-1
例如,[100:0:-2]->范围(len(s)-1,0,-2)->范围(4,0,-2)->4,2
如果i<0或j<0,则i=max(-1,len(s)+i)或j=max(-1len(s)+j)
例如,[-2:-10:-2]->range(len(s)-2,-1,-2)->range(3,-1,-1)->3,1
如果未指定i,则i=len(s)-1
例如,[:0:-2]->范围(len(s)-1,0,-2)->范围(4,0,-2)->4,2
如果未指定j,则j=-1
例如,[2::-2]->范围(2,-1,-2)->2,0
例如,[::-1]->range(len(s)-1,-1,-1)->range(4,-1,1)->4,3,2,1,0
总而言之
如果你觉得切片中的负指数令人困惑,这里有一个非常简单的方法来考虑:用len-index替换负指数。例如,用len(list)-3替换-3。
说明切片在内部做什么的最佳方法是在实现此操作的代码中显示它:
def slice(list, start = None, end = None, step = 1):
# Take care of missing start/end parameters
start = 0 if start is None else start
end = len(list) if end is None else end
# Take care of negative start/end parameters
start = len(list) + start if start < 0 else start
end = len(list) + end if end < 0 else end
# Now just execute a for-loop with start, end and step
return [list[i] for i in range(start, end, step)]
在找到这张很棒的桌子http://wiki.python.org/moin/MovingToPythonFromOtherLanguages
Python indexes and slices for a six-element list.
Indexes enumerate the elements, slices enumerate the spaces between the elements.
Index from rear: -6 -5 -4 -3 -2 -1 a=[0,1,2,3,4,5] a[1:]==[1,2,3,4,5]
Index from front: 0 1 2 3 4 5 len(a)==6 a[:5]==[0,1,2,3,4]
+---+---+---+---+---+---+ a[0]==0 a[:-2]==[0,1,2,3]
| a | b | c | d | e | f | a[5]==5 a[1:2]==[1]
+---+---+---+---+---+---+ a[-1]==5 a[1:-1]==[1,2,3,4]
Slice from front: : 1 2 3 4 5 : a[-2]==4
Slice from rear: : -5 -4 -3 -2 -1 :
b=a[:]
b==[0,1,2,3,4,5] (shallow copy of a)
我的大脑似乎很乐意接受lst[开始:结束]包含开始项。我甚至可以说这是一个“自然的假设”。
但偶尔会有一种怀疑悄悄出现,我的大脑会要求我保证它不包含结尾元素。
在这些时刻,我依靠这个简单的定理:
for any n, lst = lst[:n] + lst[n:]
这个漂亮的属性告诉我,lst[start:end]不包含end-th项,因为它位于lst[end:]中。
注意,这个定理对任何n都是正确的。例如,您可以检查
lst = range(10)
lst[:-42] + lst[-42:] == lst
返回True。
切片规则如下:
[lower bound : upper bound : step size]
I-将上限和下限转换为公共符号。
II-然后检查步长是正值还是负值。
(i) 如果步长为正值,则上限应大于下限,否则将打印空字符串。例如:
s="Welcome"
s1=s[0:3:1]
print(s1)
输出:
Wel
但是,如果我们运行以下代码:
s="Welcome"
s1=s[3:0:1]
print(s1)
它将返回一个空字符串。
(ii)如果步长为负值,则上限应小于下限,否则将打印空字符串。例如:
s="Welcome"
s1=s[3:0:-1]
print(s1)
输出:
cle
但如果我们运行以下代码:
s="Welcome"
s1=s[0:5:-1]
print(s1)
输出将为空字符串。
因此,在代码中:
str = 'abcd'
l = len(str)
str2 = str[l-1:0:-1] #str[3:0:-1]
print(str2)
str2 = str[l-1:-1:-1] #str[3:-1:-1]
print(str2)
在第一个str2=str[l-1:0:-1]中,上限小于下限,因此打印dcb。
然而,在str2=str[l-1:-1:-1]中,上限不小于下限(将下限转换为负值,即-1:因为最后一个元素的索引是-1和3)。