16

リストのサブセットを、境界のあるタプルに基づいて特定の値に設定する必要があります(start,end)

現在、私はこれを行っています:

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

これは私には良くないようです。もっとpythonicアプローチはありますか?

4

3 に答える 3

20

スライスの割り当てを使用します。

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)

上限を非包括的として保存し、Python をより適切に使用してすべての+ 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]
于 2012-07-09T12:34:14.583 に答える
5
>>> L = list("qwerty")
>>> L
['q', 'w', 'e', 'r', 't', 'y']
>>> L[2:4] = ["foo"] * (4-2)
>>> L
['q', 'w', 'foo', 'foo', 't', 'y']
于 2012-07-09T12:35:41.060 に答える
1

これは、@MartijnPietersが使用するソリューションのより効率的なバージョンです。itertools.repeat

import itertools
lower, upper = bounds
upper += 1
my_list[lower:upper] = itertools.repeat('foo', (upper - lower))
于 2012-07-09T13:03:34.773 に答える