2

元の質問: 「スライス リスト」と「省略記号」の使い方を教えてもらえますか? それらはいつ役に立ちますか?ありがとう。

"slice_list" と "ellipsis" についての言語定義は次のとおりです。Alex Martelli の回答は、その起源を指摘していますが、これは私が思い描いていたものではありません。

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

5.3.3. スライス

extended_slicing ::= primary "[" slice_list "]"

スライスリスト ::= スライス項目 ("," スライス項目)* [","]

slice_item ::= 式 | 適切な_スライス | 省略記号

省略記号 ::= "..."

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

スライスのリストを使用してリスト (またはリストのリスト) を攻撃する方法を (私がそうであったように) 誰かが探している場合に備えて、スライスのリストによって選択されたリストから要素のリストを取得する 5 つの方法を次に示します。リストのリストに同じことを行う2つの方法。その場合、リストごとに1つのスライスを適用します。出力は最後のコメントにあります。ネストされた for ループを使用する例である h5 は、意味のある変数名が使用されていない場合 (更新されていない場合) を理解するのが最も難しいと思います。

#!/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]
'''
4

3 に答える 3

11

スライスリストと省略記号は、元々Pythonで導入され、numpy(古き良きNumeric)の先行に優れた構文糖衣を提供します。numpyを使用している場合(前任者のいずれかに戻る理由はありません!-)、もちろんそれらを使用する必要があります。奇妙な理由で超柔軟な多次元配列を独自に実装している場合は、numpyがそれらをどのように使用するかを研究し、おそらくそれを厳密に模倣する必要があります(結局のところ、かなりうまく設計されています)。多次元配列以外の良い使い方は考えられません。

于 2009-11-09T02:13:13.187 に答える
3

Numpy はそれらを使用して配列スライスを実装します。

于 2009-11-09T02:03:14.063 に答える
1

省略記号についてはよくわかりません。悪い答えを出さないように、これについては説明しません。

リストのスライスは次のとおりです。

リストのインデックスは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]

リスト全体を1つのスライスとして返します。

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

3番目のインデックスを含むすべての要素を含むリストのスライスを取得します。

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

5番目のインデックスまでのすべての要素を含み、5番目のインデックスを含まないリストのスライスを取得します。

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]
于 2009-11-09T02:13:52.147 に答える