Python
python3

[第3回 Python学習で驚いたこと]リストの要素をスライスを用いてまとめて変更

背景

おかげさまでPythonの勉強は着々と進んでおり,ついにリストの操作に入った.

すでにMATLABを研究に用いていることもあり,MATLABと同じように配列(リスト)の複数の要素を変更できる方法がPythonにも実装されているとのことで「これは嬉しい!!」となったので記しておく.

(ひょっとしたらC言語とかにもこの概念あるのかな・・・?)

スライス

スライスについてはココで書いた.当時は文字列のみだったがリストについてもこの概念が成立する.たとえば,

list = [1,2,3]
print(list[0]) #1を表示
print(list[0:1]) #1を表示

といった感じだ.

一般的な要素の変更

リストの要素を変更する場合は,基本的に参照したインデックスに代入する文を書くのが基本だ.特にC言語から始めた人だと,

int a[3]={1,2,3}; //配列

a[0] = 4; //{4,2,3}
a[1] = 5; //{4,5,3}
a[2] = 6; //{4,5,6}

と書く記法が身についているはず.もう少し応用すると

int a[3] = {1,2,3}; //配列
int i; //ループ用

for(i = 0; i < 3; i++){
     a[i] += 3;
}

と書いても同じ値が代入される.
しかし,配列インデックス一つ一つに対し代入文を書いているようでは大きな配列を扱う場合の実行時間が膨大になる.特にこれはループを用いる際に顕著になる.

Pythonではスライスを用いることでなるべく少ない行数で多くのインデックスのデータを扱うことができる.ここではその記法を示す.

スライスを用いた要素変更

先程,

int a[3]={1,2,3}; //配列

a[0] = 4; //{4,2,3}
a[1] = 5; //{4,5,3}
a[2] = 6; //{4,5,6}

と書いた.同じような文をPythonでスライスを用いて書くと,

list = [1,2,3]

list[0:2] = [4,5] #リストは[4,5,3]となる

以上.記法上,リストの値をソースコード上でそのまま記入することになるので可読性が高い.

この記法はかなり単純なものなので,C言語でも

int a[3]={1,2,3}; //配列

a[3]={4,5,3}

と書いても動くとは思われるが,どちらにせよC言語ではループによる上書きが必要なので,複雑なプログラムの可読性はPythonが上と思われる.

また,Pythonはこのスライスによって参照範囲を容易に設定できるのも嬉しい.

まとめ

今回はスライスを用いたリスト要素の変更について書いた.巷では「Pythonは行数が少なく済む」とは聞いてたがここまでとは・・・・