„Slice-Listen“ und „die Auslassungspunkte“ in Python; Listen und Listen von Listen mit Listen von Scheiben schneiden

StackOverflow https://stackoverflow.com/questions/1698753

  •  18-09-2019
  •  | 
  •  

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]
'''
War es hilfreich?

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top