2010-01-25 16 views

Respuesta

21

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') 
+2

Esto es un montón de código ... –

+6

Realmente no. Si saca el código demostrativo, puede verse así: uno, cuatro, diez = operator.itemgetter (1,4,10) (line.split (',')) –

+0

¡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. –

8
lst = line.split(',') 
one, four, ten = lst[1], lst[4], lst[10] 
+2

Creo que malinterpretaste la pregunta –

+0

@Idan: puede que yo tenga, ¿no se supone que debo obtener los elementos 2º, 5º y 11º de la nueva lista? – SilentGhost

+1

@Idan K: no es necesario que la versión "Pythonic" sea una expresión única como la versión Perl. –

1

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.

4

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(',')) 
+0

La importación correcta es 'del operador de importación itemgetter' –

+0

thx, editado ... – miku

+0

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. –

18

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]] 
+1

Se llama una [lista de comprensión] (http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions), no muestra la compresión. – Bengt

+1

Corregido. larga vida. – has2k1

2

¿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] 
0

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.

Cuestiones relacionadas