“Un pedacito listas” y “los puntos suspensivos” en Python; rebanar listas y listas de listas con las listas de rebanadas

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

  •  18-09-2019
  •  | 
  •  

Pregunta

pregunta original: ¿Puede alguien decirme cómo utilizar las listas "rebanada" y los "puntos suspensivos"? Cuando son útiles? Gracias.

Esto es lo que la definición del lenguaje dice acerca de "slice_list" y "puntos suspensivos"; La respuesta de Alex Martelli señala su origen, que no es lo que yo había imaginado.

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

  

5.3.3. Cortes en láminas

     

     

extended_slicing :: = primaria "["   slice_list "]"

     

:: = slice_list slice_item ( ""   slice_item) * [ ""]

     

:: = slice_item expresión |   proper_slice | elipsis

     

     

elipsis :: = "..."

     

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

En caso de que alguien (como yo) está buscando la manera de atacar una lista (o una lista de listas) con una lista de las rebanadas, aquí están 5 maneras de obtener una lista de elementos de una lista que son seleccionados por una lista de las rebanadas y 2 formas de hacer lo mismo a una lista de listas, en ese caso la aplicación de un corte por lista. La salida está en un comentario al final. Encuentro h5, el ejemplo que utiliza bucles for anidados, el más difícil de entender si no se utilizan los nombres de variables significativas (actualizado).

#!/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]
'''
¿Fue útil?

Solución

listas y los puntos suspensivos Slice se introdujeron originalmente en Python para suministrar agradable azúcar sintaxis para el precedessor de numpy (buen viejo numérico). Si está utilizando numpy (no hay razón para volver a cualquiera de sus predecesores -) se debe, por supuesto utilizarlos; si por cualquier razón extraña que está haciendo su propia implementación de matrices multidimensionales súper flexibles, que sin duda desea estudiar la forma en que los utiliza numpy y probablemente imitar de cerca (que es bastante bien diseñada después de todo). No puedo pensar en buenos usos más allá de matrices multidimensionales.

Otros consejos

Numpy los utiliza para aplicar matriz de corte.

No estoy muy seguro acerca de puntos suspensivos, por lo que no me referiré a eso, para que no os doy una mala respuesta.

Aquí va la lista rebanar:

Espero que sepas que Indices de lista comienzan a 0.

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

La indexación en una lista:

l[0]
>>> 0

l[5]
>>> 5

Cortando una lista. El primer índice se incluye, pero no el último:

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

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

Vuelta toda la lista como uno de los sectores:

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

Obtener una rebanada de la lista que contiene todos los elementos incluidos y después de la tercera índice:

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

Obtener una rebanada de la lista que contiene todos los elementos hasta, pero sin incluir el quinto índice:

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

Aquí hay algo que no se puede esperar pitón hacer:

l[5:18]  # note: there is no 18th index in this list
>>> [5, 6, 7, 8, 9]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top