2012-07-09 13 views
7

Necesito establecer un subconjunto de una lista en un valor específico basado en una tupla con límites (start,end).Python: establecer el rango de la lista en un valor específico

Actualmente estoy haciendo esto:

indexes = range(bounds[0], bounds[1] + 1) 
for i in indexes: 
    my_list[i] = 'foo' 

Esto no parece bueno para mí. ¿Hay un enfoque más pitónico?

+1

Usted puede usar la asignación rebanada, pero creo que el método está muy bien. Por cierto, el plural del índice es _indices_. – wim

+2

Honestamente, la forma en que lo está haciendo está bien y es legible, no creo que al comprimirlo en una línea se agregue algo. –

+2

@wim, yo también prefiero _indices_, pero la mayoría de los diccionarios modernos reconocen ambos como aceptables. – senderle

Respuesta

11

Uso asignación rebanada:

my_list[bounds[0]:bounds[1] + 1] = ['foo'] * ((bounds[1] + 1) - bounds[0]) 

o el uso de variables locales añadir su + 1 sólo una vez:

lower, upper = bounds 
upper += 1 
my_list[lower:upper] = ['foo'] * (upper - lower) 

Es posible que desee almacenar el límite superior que no inclusivo, para jugar mejor con Python y evitar todos los recuentos + 1.

Demostración:

>>> my_list = range(10) 
>>> bounds = (2, 5) 
>>> my_list[bounds[0]:bounds[1] + 1] = ['foo'] * ((bounds[1] + 1) - bounds[0]) 
>>> my_list 
[0, 1, 'foo', 'foo', 'foo', 'foo', 6, 7, 8, 9] 
+5

+1 para "almacenar el límite superior como no inclusivo". n + 1 errores son un gran dolor. – senderle

2
>>> L = list("qwerty") 
>>> L 
['q', 'w', 'e', 'r', 't', 'y'] 
>>> L[2:4] = ["foo"] * (4-2) 
>>> L 
['q', 'w', 'foo', 'foo', 't', 'y'] 
1

Aquí está una versión más eficiente de la solución mediante el uso de @MartijnPieters itertools.repeat

import itertools 
lower, upper = bounds 
upper += 1 
my_list[lower:upper] = itertools.repeat('foo', (upper - lower)) 
Cuestiones relacionadas