2017-01-19 9 views
3

文字列のリストを作成したいと思います。文字列は、いくつかの要素を除いてすべて同じでなければなりません。これを行うと、私は奇妙な行動に出くわした:文字列のリストの要素を変更する

x = ['spam', 'spam', 'spam', 'spam', 'spam'] 
x[1] = 'buzz' 
x[2] = 'buzz' 
x 

Out[35]: ['spam', 'buzz', 'buzz', 'spam', 'spam'] 

しかし、その一方で:

y = ['spam'] * 5 
y[1:3] = ['buzz'] 
y 
Out[36]: ['spam', 'buzz', 'spam', 'spam'] 

誰かの嘆願は、私が間違っているのを教えすることはできますか?ご助力ありがとうございます!

+0

'y [1:3] = [' buzz '] 'make' y [1:3] = [' buzz '] * 2' –

答えて

3

を行う割り当てと同じではありません。

y = ['spam'] * 5 

yのようなリストされるようになりますthis:

['spam', 'spam', 'spam', 'spam', 'spam'] 

y[1:3]インデックス1及び2における要素を捕捉し、このように見える配列スライス:

['spam', 'spam'] 

(スライス開始)インデックス1にアレイのスライスを整列:

 
['spam', 'spam', 'spam', 'spam', 'spam'] # y 
     ['spam', 'spam']     # y[1:3] 

、あなたが割り当てy[1:3] = ['buzz']を作るとき、それは基本的に以下にこのターン:

 
['spam', 'buzz', 'spam', 'spam'] 
     ['buzz']     
1

y[1:3]はリストのスライスであり、このスライスを単一の要素で構成されるリストで置き換えます。

spam spam spam spam spam 
    \  /
     \ /
     \ /
spam buzz spam spam 

IIUC、あなたがしたいことは、新しい要素(バズ)のN倍で構成される同じサイズのリストに置き換えることです。ここでは別の落とし穴だ、追記として

for i in [1, 2]: 
    y[i] = 'buzz' 
# or equivalently 
for i in range(1, 3): 
    y[i] = 'buzz' 

あなたは、このようにループを使用するよりも同等の、より効率的である

y[1:3] = ['buzz', 'buzz'] 
# or equivalently 
y[1:3] = ['buzz'] * 2 

を書くことができます。文字列はイテレータなので、反復子を期待して、文字列を渡すされるたびに、文字列は1文字の文字列のリストとして、文字ごとに文字の上に反復される。この場合

y[1:3] = 'buzz' 
print(y) 
# ['spam', 'b', 'u', 'z', 'z', 'spam', 'spam', 'spam'] 

、スライス[1:3]です指定したイテレータに置き換えられました。これは「バズ」で、['b', 'u', 'z', 'z']として扱われます。

+0

あなたは本当に速いです!すべての答えをありがとう! – Benjamin

0
y[1:3] = ['buzz'] 

これはy[1] = 'buzz'プラスy[2] = 'buzz'

だけforループ

for i in [1,2..whatever you need to change]: 
    y[i] = 'buzz' 
関連する問題