2011-08-15 17 views
19

¿Hay alguna manera en python de usar una tupla como los índices de un sector? La siguiente no es válido:Crear un sector usando una tupla

>>> a = range(20) 
>>> b = (5, 12) # my slice indices 
>>> a[b]   # not valid 
>>> a[slice(b)] # not valid 
>>> a[b[0]:b[1]] # is an awkward syntax 
[5, 6, 7, 8, 9, 10, 11] 
>>> b1, b2 = b 
>>> a[b1:b2]  # looks a bit cleaner 
[5, 6, 7, 8, 9, 10, 11] 

Parece que una sintaxis razonablemente Pythonic por lo que me sorprende que no puedo hacerlo.

(actualización) Y la solución resulta ser:

>>> a[slice(*b)] 
[5, 6, 7, 8, 9, 10, 11] 

Respuesta

33

Puede utilizar la sintaxis de Python *args para esto:

>>> a = range(20) 
>>> b = (5, 12) 
>>> a[slice(*b)] 
[5, 6, 7, 8, 9, 10, 11] 

Básicamente, usted está diciendo a Python para descomprimir la tupla b en elementos individuales y pase cada uno de esos elementos a la función slice() como argumentos individuales.

10

¿Qué tal a[slice(*b)]?

¿Es eso lo suficientemente pitónico?

+0

me había olvidado por completo de la sintaxis '* args' de pitón. Aunque sería más pitónico si pudiera escribir 'a [* b]'. Por supuesto, esto entraría en conflicto con las matrices multidimensionales, por lo que la sintaxis de corte ordinario es aún mejor. La inclusión de la porción de palabra es más larga, pero probablemente ilustra mucho más claramente el propósito del código. – Mike

4

slice toma hasta tres argumentos, pero solo le está dando uno con una tupla. Lo que hay que hacer es tener pitón desempaquetar, así:

a[slice(*b)] 
2

Sólo un pequeño personaje que falta;)

In [2]: a = range(20) 

In [3]: b = (5, 12) 

In [4]: a[slice(*b)] 
Out[4]: [5, 6, 7, 8, 9, 10, 11 
Cuestiones relacionadas