¿Hay alguna manera "Pythonic" de conseguir solamente ciertos valores de una lista, similar a este código Perl:pitón seleccionar elementos específicos de una lista
my ($one,$four,$ten) = line.split(/,/)[1,4,10]
¿Hay alguna manera "Pythonic" de conseguir solamente ciertos valores de una lista, similar a este código Perl:pitón seleccionar elementos específicos de una lista
my ($one,$four,$ten) = line.split(/,/)[1,4,10]
Creo que busca operator.itemgetter
:
import operator
line=','.join(map(str,range(11)))
print(line)
# 0,1,2,3,4,5,6,7,8,9,10
alist=line.split(',')
print(alist)
# ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
one,four,ten=operator.itemgetter(1,4,10)(alist)
print(one,four,ten)
# ('1', '4', '10')
lst = line.split(',')
one, four, ten = lst[1], lst[4], lst[10]
Creo que malinterpretaste la pregunta –
@Idan: puede que yo tenga, ¿no se supone que debo obtener los elementos 2º, 5º y 11º de la nueva lista? – SilentGhost
@Idan K: no es necesario que la versión "Pythonic" sea una expresión única como la versión Perl. –
Sí:
data = line.split(',')
one, four, ten = data[1], data[4], data[10]
También puede usar itemgetter, pero prefiero el código anterior, es más claro, y claridad == buen código.
Trate operator.itemgetter (disponible en Python 2.4 o más reciente):
devolver un objeto invocable que obtiene elemento de su operando utilizando el método del operando ____ ____ GetItem(). Si se especifican varios elementos, devuelve una tupla de valores de búsqueda.
>>> from operator import itemgetter
>>> line = ','.join(map(str, range(11)))
>>> line
'0,1,2,3,4,5,6,7,8,9,10'
>>> a, b, c = itemgetter(1, 4, 10)(line.split(','))
>>> a, b, c
('1', '4', '10')
Condensada:
>>> # my ($one,$four,$ten) = line.split(/,/)[1,4,10]
>>> from operator import itemgetter
>>> (one, four, ten) = itemgetter(1, 4, 10)(line.split(','))
La importación correcta es 'del operador de importación itemgetter' –
thx, editado ... – miku
Eres un salvavidas, gracias! Si timeit es correcto, esto debería reducir el tiempo de ejecución de un codensippet que examinamos hoy de 9 horas a unos pocos segundos. –
Usando una lista por comprensión
line = '0,1,2,3,4,5,6,7,8,9,10'
lst = line.split(',')
one, four, ten = [lst[i] for i in [1,4,10]]
¿Qué tal esto:
index = [1, 0, 0, 1, 0]
x = [1, 2, 3, 4, 5]
[i for j, i in enumerate(x) if index[j] == 1]
#[1, 4]
Alternativamente, si usted tenía una matriz Numpy lugar de una lista, que podría hacer womething como:
from numpy import array
# Assuming line = "0,1,2,3,4,5,6,7,8,9,10"
line_array = array(line.split(","))
one, four, ten = line_array[[1,4,10]]
El truco aquí es que se puede pasar una lista (o una matriz Numpy) como índices de matriz.
EDIT: Primero pensé que también funcionaría con tuplas, pero es un poco más complicado. Sugiero que se quede con listas o matrices.
Esto es un montón de código ... –
Realmente no. Si saca el código demostrativo, puede verse así: uno, cuatro, diez = operator.itemgetter (1,4,10) (line.split (',')) –
¡Usted es un salvavidas, gracias! Si timeit es correcto, esto debería reducir el tiempo de ejecución de un codensippet que examinamos hoy de 9 horas a unos pocos segundos. –