2012-07-09 8 views
7

È necessario impostare un sottoinsieme di un elenco su un valore specifico basato su una tupla con limiti (start,end).Python - imposta l'intervallo di elenco su un valore specifico

Attualmente sto facendo questo:

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

Ciò non sembra buono per me. C'è un approccio più pitonico?

+1

È possibile utilizzare l'assegnazione fetta, ma penso che il metodo va bene. A proposito, il plurale dell'indice è _indices_. – wim

+2

Onestamente, il modo in cui lo stai facendo è soddisfacente e leggibile, non penso che comprimerlo in una sola riga aggiunga nulla. –

+2

@wim, anche io preferisco _indices_, ma i dizionari più moderni riconoscono entrambi come accettabili. – senderle

risposta

11

Usa assegnazione fetta:

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

o utilizzando le variabili locali aggiungere la + 1 solo una volta:

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

Si consiglia di memorizzare il limite superiore come non inclusivo, a giocare meglio con python ed evitare tutti i conteggi + 1.

Demo:

>>> 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 per "memorizzare il limite superiore come non inclusivo". n + 1 bug sono un enorme dolore. – 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

Ecco una versione più efficiente della soluzione da @MartijnPieters utilizzando itertools.repeat

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