リストのサブセットを、範囲が(start,end)
のタプルに基づいて特定の値に設定する必要があります。Python - リスト範囲を特定の値に設定する
現在、私はこれをやっている:
indexes = range(bounds[0], bounds[1] + 1)
for i in indexes:
my_list[i] = 'foo'
これは私には良く見えません。より多くのpythonicアプローチはありますか?
リストのサブセットを、範囲が(start,end)
のタプルに基づいて特定の値に設定する必要があります。Python - リスト範囲を特定の値に設定する
現在、私はこれをやっている:
indexes = range(bounds[0], bounds[1] + 1)
for i in indexes:
my_list[i] = 'foo'
これは私には良く見えません。より多くのpythonicアプローチはありますか?
使用スライスの割り当て:
my_list[bounds[0]:bounds[1] + 1] = ['foo'] * ((bounds[1] + 1) - bounds[0])
または一度だけあなたの+ 1
を追加するために、ローカル変数を使用して:
lower, upper = bounds
upper += 1
my_list[lower:upper] = ['foo'] * (upper - lower)
あなたはとのより良い再生するには、非包括的として上限を保存することもできますすべての+ 1
の数を避けてください。
デモ:
>>> 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]
+1 "上限を非包含的として格納する"。 n + 1のバグは大きな痛みです。 – senderle
>>> L = list("qwerty")
>>> L
['q', 'w', 'e', 'r', 't', 'y']
>>> L[2:4] = ["foo"] * (4-2)
>>> L
['q', 'w', 'foo', 'foo', 't', 'y']
ここでは、あなたは、スライスの割り当てを使用することができますitertools.repeat
import itertools
lower, upper = bounds
upper += 1
my_list[lower:upper] = itertools.repeat('foo', (upper - lower))
を使用して@MartijnPietersによって溶液のより効率的なバージョンですが、私はあなたの方法は罰金だと思います。ちなみに、複数のインデックスは_indices_です。 – wim
正直なところ、あなたがやっているやり方は上手く読めるので、私はそれを1行に圧縮すると何も追加しないと思います。 –
@wim、私も_indices_を好きですが、ほとんどの現代の辞書は両方を受け入れ可能と認識しています。 – senderle