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

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