2010-01-25 25 views

risposta

21

Penso che si sta cercando 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

Questo è un sacco di codice ... –

+6

Non proprio. Se si estrae il codice dimostrativo, può apparire come segue: uno, quattro, dieci = operator.itemgetter (1,4,10) (line.split (',')) –

+0

Sei un vero toccasana, grazie! Se timeit è giusto, questo dovrebbe ridurre il tempo di esecuzione di un codenippet che abbiamo esaminato oggi da 9 ore a pochi secondi. –

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

Penso che abbiate frainteso la domanda –

+0

@Idan: potrebbe essere che ho, non dovrei ottenere il 2 °, 5 ° e 11 ° elementi della nuova lista? – SilentGhost

+1

@Idan K: Non è necessario che la versione "Pythonic" sia una singola espressione come la versione Perl. –

1

Sì:

data = line.split(',') 
one, four, ten = data[1], data[4], data[10] 

Puoi anche usare itemgetter, ma preferisco il codice sopra, è più chiaro e la chiarezza == buon codice.

4

Prova operator.itemgetter (disponibile in Python 2.4 o più recente):

restituire un oggetto chiamabile che recupera elemento dal proprio operando con il metodo ____ GetItem ____() del operando. Se sono specificati più articoli, restituisce una tupla di valori di ricerca.

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

abbreviato:

>>> # my ($one,$four,$ten) = line.split(/,/)[1,4,10] 
>>> from operator import itemgetter 
>>> (one, four, ten) = itemgetter(1, 4, 10)(line.split(',')) 
+0

L'importazione corretta è 'dall'operatore import itemgetter' –

+0

thx, modificato ... – miku

+0

Sei un vero toccasana, grazie! Se timeit è giusto, questo dovrebbe ridurre il tempo di esecuzione di un codenippet che abbiamo esaminato oggi da 9 ore a pochi secondi. –

18

Usando una lista di comprensione

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

Si chiama [list comprehension] (http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions), non elenca la compressione. – Bengt

+1

corretto. vivi a lungo. – has2k1

2

ne dite di questo:

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

In alternativa, se si ha una matrice Numpy invece di una lista, si potrebbe fare come womething:

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

Il trucco è che si può passare un elenco (o una matrice Numpy) come indici di array.

EDIT: Inizialmente ho pensato che avrebbe funzionato anche con le tuple, ma è un po 'più complicato. Suggerisco di restare con elenchi o array.

Problemi correlati