„Slice-Listen“ und „die Auslassungspunkte“ in Python; Listen und Listen von Listen mit Listen von Scheiben schneiden
Frage
Original Frage: Kann mir jemand sagen, wie „Slice-Listen“ zu verwenden und die „Auslassungszeichen“? Wann sind sie nützlich? Danke.
Hier ist, was die Sprachdefinition sagt über „slice_list“ und „Auslassungszeichen“; Alex Martelli Antwort weist ihren Ursprung aus, das ist nicht das, was ich mir vorgestellt hatte.
[ http://docs.python.org/ Referenz / expressions.html # tok-Slicing] [1]
5.3.3. Slicings
extended_slicing :: = primary "[" slice_list "]"
slice_list :: = slice_item ( "" slice_item) * [ ""]
slice_item :: = Ausdruck | proper_slice | Auslassungs
Auslassungszeichen :: = "..."
[1]: http://docs.python.org/reference/expressions.html#tok- Aufschneiden
Falls jemand (wie ich) nach Wegen suchen, eine Liste (oder eine Liste von Listen) mit einer Liste der Scheiben angreifen, sind hier 5 Möglichkeiten, eine Liste von Elementen aus einer Liste zu erhalten, die durch eine ausgewählt werden, Liste der Scheiben und zwei Möglichkeiten, um die gleiche Sache zu einer Liste von Listen, in diesem Fall der Anwendung eine Scheibe pro Liste zu tun. Die Ausgabe des in einem Kommentar am Ende. Ich finde h5, das Beispiel, das für Schleife verschachtelte verwendet, die am schwersten zu verstehen, wenn sinnvollen Variablennamen nicht verwendet werden (aktualisiert).
#!/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]
'''
Lösung
Scheibe Listen und Ellipsen wurden ursprünglich in Python eingeführt nette Syntax Zucker für die precedessor von numpy (guten alten Numerisch) zu liefern. Wenn Sie mit numpy (keinen Grund zu irgendeiner seiner Vorgänger zurück zu gehen! -) sollten Sie natürlich nutzen; wenn aus irgendeinem seltsamen Grund sind Sie Ihre eigene Implementierung von Super-flexible mehrdimensionale Arrays zu tun, werden Sie auf jeden Fall die Art und Weise numpy nutzt sie studieren wollen und wahrscheinlich imitieren es eng (es ist ziemlich gut entworfen, nachdem alle). Ich kann nicht glauben, die guten Anwendungen jenseits multidimensionalen Arrays.
Andere Tipps
Numpy verwendet sie Array Slicing zu implementieren.
Ich bin mir nicht sicher, ob Auslassungszeichen, so will ich, dass nicht ein, daß ich nicht einmal eine schlechte Antwort geben.
Hier geht Liste Slicing:
Ich hoffe, Sie wissen, dass die Liste Indizes bei 0 beginnen.
l = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Indizierung in eine Liste:
l[0]
>>> 0
l[5]
>>> 5
Slicing eine Liste. Der erste Index enthalten ist, aber nicht das letzte:
l[0:5]
>>> [0, 1, 2, 3, 4]
l[2:5]
>>> [2, 3, 4]
Gibt die ganze Liste als eine Scheibe:
l[:]
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ein Stück der Liste Erhalten Sie jedes Element einschließlich und nach dem dritten Index enthalten:
l[3:]
>>> [3, 4, 5, 6, 7, 8, 9]
ein Stück der Liste Erhalten Sie jedes Element bis zu, aber nicht einschließlich dem 5. Index enthalten:
l[:5]
>>> [0, 1, 2, 3, 4]
Hier ist etwas, das Sie nicht Python zu tun erwarten:
l[5:18] # note: there is no 18th index in this list
>>> [5, 6, 7, 8, 9]