2010-01-25 22 views

Antwort

21

Ich glaube, Sie für operator.itemgetter suchen:

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

Das ist eine Menge Code ... –

+6

Nicht wirklich. Wenn Sie den Demonstrationscode herausnehmen, kann er so aussehen: eins, vier, zehn = operator.itemgetter (1,4,10) (line.split (',')) –

+0

Sie sind ein Lebensretter, danke! Wenn Zeit stimmt, sollte dies die Laufzeit eines Codes, den wir heute untersucht haben, von 9 Stunden auf einige Sekunden reduzieren. –

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

Ich glaube, Sie haben die Frage falsch verstanden –

+0

@Idan: kann ich habe, soll ich nicht, 2., 5. und 11. Elemente der neuen Liste zu bekommen? – SilentGhost

+1

@Idan K: Es gibt keine Anforderung, dass die "Pythonic" -Version ein einzelner Ausdruck wie die Perl-Version sein muss. –

1

Ja:

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

Sie können auch itemgetter verwenden, aber ich bevorzuge den Code oben, es ist klarer und Klarheit == guten Code.

4

Versuchen operator.itemgetter (erhältlich in Python 2.4 oder neuer):

Return eine aufrufbare Objekt, das Element aus seinem Operanden holt mit der ____ des Operanden getitem ____() -Methode. Wenn mehrere Elemente angegeben sind, wird ein Tupel von Suchwerten zurückgegeben.

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

Condensed:

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

Der richtige Import ist 'von Operator Import itemgetter' –

+0

thx, bearbeitet ... – miku

+0

Sie sind ein Lebensretter, danke! Wenn Zeit stimmt, sollte dies die Laufzeit eines Codes, den wir heute untersucht haben, von 9 Stunden auf einige Sekunden reduzieren. –

18

Mit einer Liste Verständnis

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

Es wird als [Listenverständnis] (http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions) bezeichnet, nicht als Listenkomprimierung. – Bengt

+1

Korrigiert. lebe lang. – has2k1

2

Wie wäre es damit:

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

Alternativ, wenn Sie hatte statt einer Liste ein Numpy Array, könnten Sie tun womething wie:

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

Der hier Trick ist, dass Sie eine Liste übergeben können (oder ein Numpy Array) als Array-Indizes.

EDIT: Ich dachte zuerst, es würde auch mit Tupeln arbeiten, aber es ist ein bisschen komplizierter. Ich schlage vor, bei Listen oder Arrays zu bleiben.

Verwandte Themen