Pregunta

Estoy seguro de que hay una buena manera de hacer esto en Python, pero estoy bastante nuevo en el lenguaje, así que perdónenme si esto es una tarea fácil!

Tengo una lista, y me gusta escoger a ciertos valores de esa lista. Los valores que quiero seleccionar son aquellos cuyos índices en la lista se especifican en otra lista.

Por ejemplo:

indexes = [2, 4, 5]
main_list = [0, 1, 9, 3, 2, 6, 1, 9, 8]

la salida sería:

[9, 2, 6]

(es decir., Los elementos con índices de 2, 4 y 5 de main_list).

Tengo una sensación de que esto debería ser factible usar algo como listas por comprensión, pero no puedo averiguarlo (en particular, no puedo encontrar la manera de acceder al índice de un elemento cuando se utiliza una lista por comprensión).

¿Fue útil?

Solución

[main_list[x] for x in indexes]

Esto devolverá una lista de los objetos, usando una lista por comprensión.

Otros consejos

t = []
for i in indexes:
    t.append(main_list[i])
return t

Creo que la solución de Yuval A es una muy clara y sencilla. Pero si realmente quieres una lista de una línea de comprensión:

[e for i, e in enumerate(main_list) if i in indexes]
map(lambda x:main_list[x],indexes)

Como alternativa a una lista por comprensión, puede utilizar map con list.__getitem__. Para las grandes listas debería ver un mejor rendimiento:

import random

n = 10**7
L = list(range(n))
idx = random.sample(range(n), int(n/10))

x = [L[x] for x in idx]
y = list(map(L.__getitem__, idx))

assert all(i==j for i, j in zip(x, y))

%timeit [L[x] for x in idx]            # 474 ms per loop
%timeit list(map(L.__getitem__, idx))  # 417 ms per loop

Para un iterador perezoso, sólo puede utilizar map(L.__getitem__, idx). Tenga en cuenta en Python 2.7, map devuelve una lista, así que no hay necesidad de pasar a list.

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