2012-07-09 11 views
7

Potrzebuję ustawić podzbiór listy na konkretną wartość opartą na krotce z granicami (start,end).Python - ustaw zakres listy do określonej wartości

Obecnie robię tak:

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

Nie wydaje mi się dobry. Czy istnieje podejście bardziej pytonowe?

+1

Można użyć zadanie kawałek, ale myślę, że metoda jest w porządku. Nawiasem mówiąc, liczba mnoga indeksu to _indeks_. – wim

+2

Szczerze mówiąc, sposób w jaki to robisz jest w porządku i czytelny, nie sądzę, że kompresja do jednej linii dodaje cokolwiek. –

+2

@wim, ja też wolę _indices_, ale większość nowoczesnych słowników uznaje je za akceptowalne. – senderle

Odpowiedz

11

Zastosowanie Przypisanie plaster:

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

lub za pomocą zmiennych lokalnych, aby dodać + 1 tylko raz:

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

Możesz przechowywać górna granica jako non-inclusive, aby grać lepiej python i unikaj wszystkich liczb + 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, aby "przechowywać górną granicę jako niewiążącą." n + 1 robaki to ogromny problem. – 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

Oto bardziej wydajne wersja rozwiązania przez @MartijnPieters użyciu itertools.repeat

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