A cosa serve la funzione integrata slice
e come posso usarla?
Il modo diretto di affettare Pythonic so - l1[start:stop:step]
. Voglio sapere se ho un oggetto fetta, quindi come lo uso?Python slice how-to, conosco la sezione Python ma come posso usare l'oggetto slice incorporato per esso?
risposta
si crea una fetta chiamando fetta con gli stessi campi si userebbe se facendo [start: end: step] notazione:
sl = slice(0,4)
Per utilizzare la fetta, basta passare come se fosse l'indice in una lista o stringa:
>>> s = "ABCDEFGHIJKL"
>>> sl = slice(0,4)
>>> print(s[sl])
'ABCD'
Supponiamo di avere un file di campi di testo a lunghezza fissa. È possibile definire un elenco di sezioni per estrarre facilmente i valori da ciascun "record" in questo file.
data = """\
0010GEORGE JETSON 12345 SPACESHIP ST HOUSTON TX
0020WILE E COYOTE 312 ACME BLVD TUCSON AZ
0030FRED FLINTSTONE 246 GRANITE LANE BEDROCK CA
0040JONNY QUEST 31416 SCIENCE AVE PALO ALTO CA""".splitlines()
fieldslices = [slice(*fielddef) for fielddef in [
(0,4), (4, 21), (21,42), (42,56), (56,58),
]]
fields = "id name address city state".split()
for rec in data:
for field,sl in zip(fields, fieldslices):
print("{} : {}".format(field, rec[sl]))
print('')
stampe:
id : 0010
name : GEORGE JETSON
address : 12345 SPACESHIP ST
city : HOUSTON
state : TX
id : 0020
name : WILE E COYOTE
address : 312 ACME BLVD
city : TUCSON
state : AZ
id : 0030
name : FRED FLINTSTONE
address : 246 GRANITE LANE
city : BEDROCK
state : CA
id : 0040
name : JONNY QUEST
address : 31416 SCIENCE AVE
city : PALO ALTO
state : CA
La funzione slice
restituisce slice objects. Gli oggetti slice sono uno dei tipi interni di Python, che sono ottimizzati per le prestazioni di lettura - tutti i loro attributi sono di sola lettura.
Altering slice
potrebbe essere utile se si desidera modificare il comportamento predefinito. Ad esempio, lxml
utilizza la notazione di sezione per accedere agli elementi DOM (tuttavia, non ho confermato come l'hanno fatto personalmente).
parentesi quadre seguendo una sequenza indicano sia indicizzazione o affettamento seconda di ciò che è all'interno delle parentesi:
>>> "Python rocks"[1] # index
'y'
>>> "Python rocks"[1:10:2] # slice
'yhnrc'
Entrambi questi casi sono gestite dai il metodo __getitem__()
della sequenza (o __setitem__()
se sulla sinistra di un segno di uguale). L'indice o la sezione viene passato ai metodi come un singolo argomento, e t Il modo in cui lo fa Python è convertendo la notazione della sezione, (1:10:2
, in questo caso) in un oggetto porzione: slice(1,10,2)
.
Quindi, se si sta definendo la propria classe di sequenza simile o ignorando le __getitem__
o __setitem__
o __delitem__
metodi di un'altra classe, è necessario testare l'argomento indice per determinare se si tratta di un int
o un slice
, e il processo di conseguenza:
def __getitem__(self, index):
if isinstance(index, int):
... # process index as an integer
elif isinstance(index, slice):
start, stop, step = index.indices(len(self)) # index is a slice
... # process slice
else:
raise TypeError("index must be int or slice")
un oggetto slice
ha tre attributi: start
, stop
e step
, e un metodo: indices
, che prende un singolo argomento, la lunghezza dell'oggetto, e restituisce una tupla di 3 elementi: (start, stop, step)
.
>>> class sl:
... def __getitem__(self, *keys): print keys
...
>>> s = sl()
>>> s[1:3:5]
(slice(1, 3, 5),)
>>> s[1:2:3, 1, 4:5]
((slice(1, 2, 3), 1, slice(4, 5, None)),)
>>>
Vedere la risposta di Don qui sotto per spiegazioni sul perché questo accade. – abc
Sarebbe utile sottolineare anche che possono essere passate più fette in '__getitem__':' s [1: 2: 3, 1, 4: 5] => (slice (1, 2, 3), 1 , slice (4, 5, None)) '. – OozeMeister
- 1. Index e Slice un generatore in Python
- 2. [python]: come implementare slice in python3?
- 3. Indici di slice stringa di Python - slice to end of string
- 4. Notazione Slice in Scala?
- 5. Numpy: arr [..., 0 ,:] funziona. Ma come posso archiviare i dati contenuti nel comando slice (..., 0, :)?
- 6. Slice Chunking in Go
- 7. Quali sono gli indici di slice predefiniti in Python * veramente *?
- 8. Slice Pandas DataFrame per riga
- 9. .slice e .wrapall
- 10. Angularjs splice vs slice?
- 11. Umlauts e slice
- 12. , formattazione dell'operatore di slice
- 13. Numpy slice of arbitrary dimensions
- 14. Django Template Slice - Inversione Order
- 15. Go lang slice columns from 2d array?
- 16. NumPy array slice using None
- 17. Java: Slice Array To End
- 18. Restituisce stringa locale come slice (& str)
- 19. slice a stringhe immutabili per riferimento e non copia
- 20. Go: prestazioni impreviste durante l'accesso a un array attraverso una porzione di slice (slice 2D)
- 21. Come imparo Python 2 se conosco già Python 3?
- 22. Array vs Slice: velocità di accesso
- 23. golang html/template: come indicizzare un elemento slice?
- 24. numeri di django slice nel modello
- 25. Divisione NAL/slice codificata H.264
- 26. numpy "Mean of empty slice". avvertimento
- 27. Thread Python in Python incorporato: come?
- 28. Qual è la differenza tra slice() e substr() in JavaScript?
- 29. Il modo più veloce per trovare la funzione di calcolo su slice DataFrame per valore di colonna (panda Python)
- 30. estratto/slice/riordina gli elenchi in (emacs) lisp?
questo ha funzionato per me. def __slice __ (self, start = None, end = None, step = None): return self.obj [slice (start, end, step)] – user2290820