2012-07-09 5 views
7

Listenin bir alt kümesini, (start,end) sınırlarına sahip bir tuple dayalı belirli bir değere ayarlamanız gerekir. Python - belirli bir değere set aralığı

Şu anda yapıyorum:

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

Bu benim için iyi görünmüyor. Daha pythonic bir yaklaşım var mı?

+1

Sen dilim ataması kullanabilirsiniz kullanarak @MartijnPieters tarafından çözümün daha verimli versiyonu, ama senin yöntem iyi olduğunu düşünüyorum. Bu arada, çok sayıda indeks _indices_. – wim

+2

Dürüst olmak gerekirse, yaptığınız gibi iyi ve okunabilir, bir çizgiye indirmenin hiçbir şey eklemediğini sanmıyorum. –

+2

@wim, ben de _indices_ tercih ederim, ancak modern sözlüklerin çoğu kabul edilebilir olarak kabul eder. – senderle

cevap

11

Kullanım dilim ataması:

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

veya sadece bir kez + 1 eklemek için yerel değişkenleri kullanarak:

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

Sen daha oynamak olmayan kapsayıcı olarak üst sınır saklamak isteyebilirsiniz python ve tüm + 1 sayımlarından kaçının.

Demo: Burada

>>> 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 "üst sınırı kapsayıcı olarak saklamak." n + 1 böcekleri büyük bir acıdır. – 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

itertools.repeat

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