Python中的“切片列表”和“省略号”;用切片列表切片列表和列表中的列表
原问题:有人能告诉我如何使用“切片列表”和“省略号”吗?它们什么时候有用?谢谢。
这是语言定义中关于“切片列表”和“省略号”的说明;Alex Martelli的回答指出了它们的来源,这并不是我之前想的那样。
[http://docs.python.org/reference/expressions.html#tok-slicing][1]
5.3.3. 切片
extended_slicing ::= primary "[" slice_list "]"
slice_list ::= slice_item ("," slice_item)* [","]
slice_item ::= expression | proper_slice | ellipsis
ellipsis ::= "..."
[1]: http://docs.python.org/reference/expressions.html#tok-slicing
如果有人(就像我之前一样)在寻找用切片列表来处理一个列表(或列表的列表)的方法,这里有5种方法可以从一个列表中获取通过切片列表选择的元素,还有2种方法可以对列表的列表做同样的事情,在这种情况下,每个列表应用一个切片。输出结果在最后的评论中。我发现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]
'''
3 个回答
我对省略号不是很确定,所以我就不讨论这个了,免得给你错误的答案。
接下来我们来聊聊列表切片:
希望你知道,列表的索引是从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]
获取一个切片,包含所有元素,直到但不包括第五个索引:
l[:5]
>>> [0, 1, 2, 3, 4]
这里有一些你可能不会想到的Python行为:
l[5:18] # note: there is no 18th index in this list
>>> [5, 6, 7, 8, 9]
Numpy用它们来实现数组切片。
切片列表和省略号最初是在Python中引入的,目的是为了给早期的numpy(也就是老版的Numeric)提供更好用的语法。如果你在使用numpy(没理由去用它的前身!),当然应该使用这些功能;如果出于某种奇怪的原因你在自己实现超级灵活的多维数组,那你一定要好好研究一下numpy是怎么使用这些功能的,可能还要模仿它(毕竟它的设计还是相当不错的)。我想不出除了多维数组之外有什么好的用法。