2009-11-09 72 views
2

原始问题:有人可以告诉我如何使用“切片列表”和“省略号”?他们什么时候有用?谢谢。Python中的“切片列表”和“省略号”;切片列表和列表与列表切片

下面是关于“slice_list”和“ellipsis”的语言定义所说的内容; Alex Martelli的回答指出了他们的起源,这不是我所设想的。

[http://docs.python.org/reference/expressions.html#tok-slicing][1]

5.3.3。 Slicings

extended_slicing :: =初级 “[” slice_list “]”

slice_list :: = slice_item( “” slice_item)* [ “”]

slice_item: :=表达式| proper_slice |省略号

省略号:: = “...”

[1]: http://docs.python.org/reference/expressions.html#tok-slicing

在任何人的情况下(如我)正在寻找方法来攻击列表(或列表列表)与切片列表,这里有5种方法来获取列表中的元素列表,这些元素列表由片段列表选择,还有两种方法可以对列表列表做同样的事情,每个列表应用一个切片的情况。输出在最后的评论中。我发现h5是使用嵌套for循环的例子,最难理解是否使用了有意义的变量名(更新)。

#!/usr/bin/env python 



import itertools 

puz = [(i + 100) for i in range(40)] 
puz1 = list(puz) 
puz2 = [(i + 200) for i in range(40)] 
puz3 = [(i + 300) for i in range(40)] 
puzs = [puz1,puz2,puz3] 

sa = slice(0,1,1) 
sb = slice(30,39,4) 
sc = slice(-1, -15,-5) 
ss = [sa,sb,sc] 

def mapfunc(a,b): 
    return a[b] 

f = map(mapfunc,[puz] * len(ss),ss) 
print "f = ", f #same as g below 

g = [ puz[i] 
    for i in ss ] 
print "g = ",g #same as f, above 

h1 = [ i 
    for i in itertools.chain(puz[sa],puz[sb],puz[sc]) ] 
print "h1 = ", h1 #right 

h2 = [ i 
    for i in itertools.chain(*(map(mapfunc,[puz] * len(ss),ss))) ] 
print "h2 = ",h2 #right 

h3 = [ i 
    for i in itertools.chain(*f) ] 
print "h3 = ",h3 #right 

h4 = [ i 
    for i in itertools.chain(*g) ] 
print "h4 = ", h4 #also right 

h5 = [] 
for slice_object in ss: 
    for list_element in puz[slice_object]: 
     h5.append(list_element) 
print "h5 = ", h5 #right, too 

print "==============================" 

hh1 = [ i 
    for i in itertools.chain(*(map(mapfunc,puzs,ss))) ] 
print "hh1 = ",hh1 #right 

puz_s_pairs = zip(puzs,ss) 
#print "puz_s_pairs = ",puz_s_pairs 
hh2 = [ i 
    for i in itertools.chain(*(map(mapfunc,*zip(*puz_s_pairs)))) ] 
print "hh2 = ",hh2 #right 

''' 
>>> execfile(r'D:/cygwin/home/usr01/wrk/py/pyexpts/list_of_slices_of_list.02.py') 
f = [[100], [130, 134, 138], [139, 134, 129]] 
g = [[100], [130, 134, 138], [139, 134, 129]] 
h1 = [100, 130, 134, 138, 139, 134, 129] 
h2 = [100, 130, 134, 138, 139, 134, 129] 
h3 = [100, 130, 134, 138, 139, 134, 129] 
h4 = [100, 130, 134, 138, 139, 134, 129] 
h5 = [100, 130, 134, 138, 139, 134, 129] 
============================== 
hh1 = [100, 230, 234, 238, 339, 334, 329] 
hh2 = [100, 230, 234, 238, 339, 334, 329] 
''' 

回答

10

切片列表和省略号最初是在Python中引入的,它为numpy(好的旧数字)的先驱提供了很好的语法糖。如果你使用numpy(没有理由回到它的任何前辈 - ),你当然应该使用它们;如果出于任何奇怪的原因,你正在做自己的超灵活多维数组的实现,你一定要研究numpy使用它们的方式,并且可能会模仿它(它毕竟设计得很好)。除了多维数组之外,我想不出有什么好用处。

+0

啊。因此,我不想把“切片分类”看作是一种用一种紧凑表达式来排列任意多列表的方法。可怜。我几乎有这个用途。 – behindthefall 2009-11-09 02:26:09

+0

对于“列表运行”,请阅读“从单个一维列表中运行”。 – behindthefall 2009-11-09 02:27:03

+1

@behindthefalls,不,运行通常通过itertools.groupby提取 - 没有特殊的语法。你当然可以在你自己的对象中实现这样的语法,但不确定这对大多数人来说都是可读的。 – 2009-11-09 02:42:38

3

numpy使用它们来实现数组切片。

+2

省略号 - 很少使用。切片 - 常见。 – 2009-11-09 02:11:58

1

我不太确定省略号,所以我不会说这个,以免我给你一个不好的答案。

这里去列表切片:

我希望你知道该列表的indeces从0开始。

l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

索引到一个列表:

l[0] 
>>> 0 

l[5] 
>>> 5 

切片的列表。第一个指标是包括在内,但不是最后:

l[0:5] 
>>> [0, 1, 2, 3, 4] 

l[2:5] 
>>> [2, 3, 4] 

返回整个列表作为一个片:

l[:] 
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

获取包含所有元素,包括和第三索引之后的一个列表的片段:

l[3:] 
>>> [3, 4, 5, 6, 7, 8, 9] 

获取包含高达每一个元素的列表的片段,但不包括第5个指标:

l[:5] 
>>> [0, 1, 2, 3, 4] 

这里的东西,你不会想到蟒蛇做:

l[5:18] # note: there is no 18th index in this list 
>>> [5, 6, 7, 8, 9] 
+1

请注意,l [:]选项是复制数组的简写,您会相当频繁地看到它。 – 2009-11-09 02:27:28

+0

这是当我遇到的事实,该语言允许您有两个或更多的切片表达式用逗号分隔,我感到困惑! ;-) – behindthefall 2009-11-09 02:29:24