Gibt es einen „pythonic“ Weg von nur bestimmten Werten aus einer Liste bekommen, ähnlich wie diesen Perl-Code:Python wählen Sie bestimmte Elemente aus einer Liste
my ($one,$four,$ten) = line.split(/,/)[1,4,10]
Gibt es einen „pythonic“ Weg von nur bestimmten Werten aus einer Liste bekommen, ähnlich wie diesen Perl-Code:Python wählen Sie bestimmte Elemente aus einer Liste
my ($one,$four,$ten) = line.split(/,/)[1,4,10]
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')
lst = line.split(',')
one, four, ten = lst[1], lst[4], lst[10]
Ich glaube, Sie haben die Frage falsch verstanden –
@Idan: kann ich habe, soll ich nicht, 2., 5. und 11. Elemente der neuen Liste zu bekommen? – SilentGhost
@Idan K: Es gibt keine Anforderung, dass die "Pythonic" -Version ein einzelner Ausdruck wie die Perl-Version sein muss. –
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.
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(','))
Der richtige Import ist 'von Operator Import itemgetter' –
thx, bearbeitet ... – miku
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. –
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]]
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]
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.
Das ist eine Menge Code ... –
Nicht wirklich. Wenn Sie den Demonstrationscode herausnehmen, kann er so aussehen: eins, vier, zehn = operator.itemgetter (1,4,10) (line.split (',')) –
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. –