Pregunta

Tengo una función como

def f():
    ...
    ...
    return [list1, list2]

Esto devuelve una lista de listas

[[list1.item1,list1.item2,...],[list2.item1,list2.item2,...]]

Ahora cuando lo haga lo siguiente:

for i in range(0,2):print f()[i][0:10]

funciona e imprimir las listas en rodajas

Pero si lo hago

print f()[0:2][0:10]

luego imprime las listas haciendo caso omiso de la [doce y diez] rebanar.

¿Hay alguna manera de hacer la segunda obra forma o qué tengo que bucle cada vez para obtener el resultado deseado?

¿Fue útil?

Solución

La razón por la que estos dos se comportan de manera diferente se debe a f()[0:2][0:10] funciona así:

  1. f() le da una lista de listas.
  2. [0:2] le da una lista que contiene los dos primeros elementos de la lista de listas. Dado que los elementos de la lista de listas son listas, esto es también una lista de listas.
  3. [0:10] le da una lista que contiene los diez primeros elementos en la lista de listas que fue producido en el paso 2.

En otras palabras, f()[0:2][0:10] comienza con una lista de listas, entonces toma una sublista de esa lista de listas (que también es una lista de listas), y luego hace una lista secundaria de la segunda lista de listas (que es también una lista de listas).

Por el contrario, en realidad f()[i] extrae el elemento i-° lugar de su lista de listas, que es sólo una simple lista (no es una lista de listas). Entonces, cuando se aplica [0:10], lo está aplicando a la lista simple que recibió de f()[i] y no a una lista de listas.

La conclusión es que cualquier solución que da el comportamiento deseado tendrá que acceder a un solo elemento de la matriz como [i] en algún momento, en lugar de trabajar únicamente con las rebanadas como [i:j].

Otros consejos

La segunda rebanada rebanadas la secuencia de regresar de la primera rebanada, así que sí, que tendrá que bucle de alguna manera con el fin de cortar dentro:

[x[0:10] for x in f()[0:2]]

Un bucle Pythonic sería:

for list in f()[0:2]:
    print list[0:10]

Sin embargo, dependiendo de lo que quiere lograr, lista por comprensión podría ser aún mejor.

O usted hace uso de pitones map() función:

def print_sub(x):
    print x[0:10]

map(print_sub, f()[0:2])

De un modo u otro, no hay manera de no iterar sobre la lista y conseguir el resultado deseado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top