2011-02-14 10 views
54

O bien, una pregunta más general sería, cómo dividir una matriz para obtener cada línea n-ésima, por lo que para parejas/impares te gustaría omitir una línea, pero en el caso general querrías obtener cada n-ésima línea, omitiendo n-1 líneas.¿La manera más corta de cortar líneas pares/impares de una matriz de python?

+0

el módulo es su amigo. –

+1

me doy cuenta de que puedo hacerlo en un ciclo con él, pero me preguntaba si podría hacerlo en una sola línea en su lugar – fatcat

+0

Buena pregunta. Las respuestas aquí también me ayudaron. Genial, merci. – Siyah

Respuesta

111

Suponiendo que está hablando de una lista , especifique el paso en el sector (y comience el índice). La sintaxis es list[start:end:step].

Probablemente conozca el acceso normal a la lista para obtener un elemento, p. l[2] para obtener el tercer artículo. Dando dos números y dos puntos entre ellos, puede especificar un rango que desea obtener de la lista. El valor de retorno es otra lista. P.ej. l[2:5] le da el tercer al sexto artículo. También puede pasar un tercer número opcional, que especifica el tamaño del paso. El tamaño de paso predeterminado es uno, que solo significa tomar cada elemento (entre el índice de inicio y final).

Ejemplo:

>>> l = range(10) 
>>> l[::2]   # even - start at the beginning at take every second item 
[0, 2, 4, 6, 8] 
>>> l[1::2]  # odd - start at second item and take every second item 
[1, 3, 5, 7, 9] 

Ver lists in the Python tutorial.

Si desea obtener todos los elementos n -ésimo de una lista (es decir, excluyendo el primer elemento), que tendría que cortar como l[(n-1)::n].

Ejemplo:

>>> l = range(20) 
>>> l 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 

Ahora, volviendo cada tercer elemento sería:

>>> l[2::3] 
[2, 5, 8, 11, 14, 17] 

Si desea incluir el primer elemento, que acaba de hacer l[::n]. se requieren

+0

Nunca había visto eso antes. El primer número es el índice inicial y el último es el paso entonces? ¿Hay algo entre el '::'? ¿O ambos son un operador, que es diferente de ':'? Si hago 'l [:: 1]', ¿entonces obtengo la matriz original? – fatcat

+1

@fatcat - http://docs.python.org/library/stdtypes.html#sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange, véanse las notas 3 y 5 –

+0

@fatcat: Sí, lo haría obtener la matriz original. Diría que con más frecuencia se ve solo una porción de un índice de inicio a final, como 'l [2: 5]'. El paso es opcional. –

-2
> map(lambda index: arr[index],filter(lambda x: x%n == 0,range(len(arr)))) 

donde arr es una lista, y n rodajas.

+1

-1 para usar 'map()' y 'filter()' con un 'lambda'. Esto se desaconseja/es lento y debe ** siempre ** hacerse usando una lista de comprensión. – ThiefMaster

+0

¿Hay algún experimento para respaldar este reclamo? – ajmartin

+0

Creo que hay una publicación de guido van rossum en algún lugar de la lista de correo de Python sobre ella. De todos modos, es obvio, ya que es llamada de función vs. no llamada de función. A menos que esté usando funciones de llamadas apiladas, es bastante caro – ThiefMaster

1

Esto es más para mí como un ejemplo completo;)

>>> import itertools 
>>> ret = [[1,2], [3,4,5,6], [7], [8,9]] 
>>> itertools.izip_longest(*ret) 
>>> [x for x in itertools.chain.from_iterable(tmp) if x is not None] 
[1, 3, 7, 8, 2, 4, 9, 5, 6] 
Cuestiones relacionadas