Python: Elegante und effiziente Wege zur Maske eine Liste
Beispiel:
from __future__ import division
import numpy as np
n = 8
"""masking lists"""
lst = range(n)
print lst
# the mask (filter)
msk = [(el>3) and (el<=6) for el in lst]
print msk
# use of the mask
print [lst[i] for i in xrange(len(lst)) if msk[i]]
"""masking arrays"""
ary = np.arange(n)
print ary
# the mask (filter)
msk = (ary>3)&(ary<=6)
print msk
# use of the mask
print ary[msk] # very elegant
und die Ergebnisse sind:
>>>
[0, 1, 2, 3, 4, 5, 6, 7]
[False, False, False, False, True, True, True, False]
[4, 5, 6]
[0 1 2 3 4 5 6 7]
[False False False False True True True False]
[4 5 6]
Als Sie sehen, die Bedienung der Maskierung auf array ist eleganter im Vergleich zur Liste. Wenn Sie versuchen, verwenden Sie die array-Maskierung Schema auf der Liste werden Sie einen Fehler erhalten:
>>> lst[msk]
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
TypeError: only integer arrays with one element can be converted to an index
Die Frage zu finden, ist eine elegante Maskierung für list
s.
Updates:
Die Antwort von jamylak
angenommen wurde, für die Einführung compress
jedoch die Punkte erwähnt, die von Joel Cornett
aus der Lösung abgeschlossen, um eine gewünschte form, die mich interessieren.
>>> mlist = MaskableList
>>> mlist(lst)[msk]
>>> [4, 5, 6]
InformationsquelleAutor Developer | 2012-04-23
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du suchst
itertools.compress
Beispiel aus den docs
Entspricht:
Seit jamylak die Frage bereits beantwortet, eine praktische Antwort, hier ist mein Beispiel für eine Liste mit eingebauter Maskierung support (völlig unnötig, btw):
Verwendung:
Beachten Sie, dass
compress
beendet, wenn entweder die Daten oder die Maske läuft. Wenn Sie möchten, halten Sie den Teil der Liste, die erstreckt sich über die Länge der Maske, die Sie könnten versuchen, so etwas wie:MaskableList
, aber ich habe einige Probleme re-instanziieren. Für jedes element in einer Schleife möchte ich diese Maske, indem Sie eine neue Liste:for i in arange(0,n): fts = MaskableList(F) sorter = argsort(A) result[i] = zip(fts[sorter],A[sorter])
aber jede iteration, fts[Sortierer] enthält die gleichen Werte, während sorter ist jedes mal anders. Ich normalerweise verwenden python eher als eine script-Sprache und somit bin ich nicht so vertraut mit Objekten.MaskableList
könnte erheblich langsamer ist, weil der etwas teuer, exception handling, das geht. Versuchen Sie, die Umstellung dertry...except
um, so dass es versucht, standardmäßig Maske.argsort
. Auch, was istA
, und was sind die Inhalte derF
?A=[3.5,2.0,1.1,4.0]
;argsort(A)
zurückkehren würde[2,1,0,3]
.F
ist nur ein un-maskierbare Liste, lassen Sie uns sagen, ["A","B","C","D"], sozip(fts[sorter],A[sorter])
sollte Ausgabe:{"A":1.1,"B":2.0,"C":3.5,"D":4.0}
MaskableList
tun nicht, was Sie denken, es tut. Es liefert als Ergebnis eine binäre Maske (1, 0, oder True/False) auf eine Liste. Es wird nicht die Reihenfolge der Elemente gemäß Liste der Indizes. Zweitenszip(fts[sorter], A[sorter])
würde die Ausgabe eine Liste von Tupeln, aber Sie haben ein dict.myList
und eine Liste von Indizesb = argsort(A)
- ich würde SienewList = [myList[i] for i in b]
das gewünschte Ergebnis zu erzielen.1-d array
Indizierung. Dies würde sehen viel schlauer, da würde ich nicht verwenden, eine weitere for-Schleifemap()
,itertools
und andere optimierte Werkzeuge). Da scheint es einen sehr langen Kommentar-thread, würde ich vorschlagen, du postest die Frage in Bezug auf unser Gespräch? Ich bin nicht super vertraut mitnumpy
und die Lösung, die Sie suchen, vielleicht schon gibt.Wenn Sie mit Numpy, können Sie es leicht tun mit Numpy-array ohne die Installation einer anderen Bibliothek:
ich denke nicht, dass es elegant. Es ist kompakt, aber eher verwirrend, als das Konstrukt ist sehr anders als die meisten Sprachen.
Als Rossum hat gesagt, über design-Sprache, verbringen wir mehr Zeit mit Lesen als schreiben. Die obskuren Bau der Linie der code, desto unübersichtlicher wird es für andere, die möglicherweise nicht vertraut sind mit Python, obwohl Sie haben die volle Kompetenz in einer beliebigen Anzahl von anderen Sprachen.
Lesbarkeit Trumpf Kurzform Notationen Alltag in der realen Welt der Service-code. Ebenso wie die Festsetzung Ihr Auto. Große Zeichnungen mit vielen Informationen machen die Fehlersuche viel einfacher.
Für mich, ich würde viel lieber beheben jemand den code verwendet, die die lange form
als die numpy kurze Schreibweise Maske. Ich muss nicht irgendwelche speziellen Kenntnisse in einem bestimmten Python-Paket zu interpretieren sind.