今さらPython3 (13) - リストの続き 要素をいじってみる
この本の第3章を読み進めてます。
- 作者: Bill Lubanovic,斎藤康毅,長尾高弘
- 出版社/メーカー: オライリージャパン
- 発売日: 2015/12/01
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
ミュータブルOK?
リストはミュータブルなので、要素を直接いじれるよという話。
>>> marxes = ['Groucho', 'Chico', 'Harpo'] >>> marxes[2] = 'Wanda' >>> marxes ['Groucho', 'Chico', 'Wanda']
オフセット2だから、3番目の要素を書き換えている。前回先走ってスライスしちゃったけど、一応ここでもスライスしておきましょ。
>>> marxes[0:2] ['Groucho', 'Chico'] >>> marxes[::2] ['Groucho', 'Wanda'] >>> marxes[::-1] ['Wanda', 'Chico', 'Groucho']
本に書いてあるのと結果がちょっと違うけど、直前に3番目の要素を'Wanda'に書き換えてるんだから、この方が正しいよね。2番目は1つおき、3番目はステップが-1なので順序を入れ替えて出している。
要素の追加のはなし
まずは、3番目の要素を'Harpo'に戻してから、
>>> marxes[2] = 'Harpo' >>> marxes ['Groucho', 'Chico', 'Harpo'] >>> marxes.append('Zeppo') >>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo']
append()で要素追加だん。
>>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo'] >>> others = ['Gummo', 'Karl'] >>> marxes.extend(others) >>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo', 'Gummo', 'Karl']
安心してください。+=でも行けますよ。
>>> marxes = marxes[:4] >>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo'] >>> marxes += others >>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo', 'Gummo', 'Karl']
でも、append(others)をやるとこうなる。
>>> marxes = marxes[:4] >>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo'] >>> marxes.append(others) >>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo', ['Gummo', 'Karl']]
そうそう、入れ子になっちゃうんだよね。
>>> marxes = marxes[:4] >>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo'] >>> marxes.insert(3, 'Gummo') >>> marxes ['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo'] >>> >>> marxes.insert(10, 'Karl') >>> marxes ['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo', 'Karl'] >>> marxes.insert(-1, 'Ken') >>> marxes ['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo', 'Ken', 'Karl']
今度はinsert()を使った要素の追加。insert()の第1引数はオフセットなので、3を渡すと4番目に、-1を渡すと後ろから2番目に挿入されると。オフセットに範囲外の10みたいな大きな数字を渡しても最後に挿入されるみたいね。
・・・おっと、マルクス兄弟に存在しない名前を入れてしまったので、消さないとね。
要素を消す
これまで使ったことなかったけど、del文による消去がありますと。
>>> del marxes[-1] >>> marxes ['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo', 'Ken'] >>> del marxes[-1] >>> marxes ['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo'] >>>
うーん。なんか美しくない。marxes.del()じゃないの?と思ったら、やっぱり補足が書いてあるね。
>>> marxes ['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo'] >>> marxes.remove('Gummo') >>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo']
remove()を使う方が美しいね。でも、同じのが複数あるときはどうなるんだろう?試すべし。
>>> marxes.insert(-1, 'Gummo') >>> marxes.append('Gummo') >>> marxes ['Groucho', 'Chico', 'Harpo', 'Gummo', 'Zeppo', 'Gummo'] >>>
Gummoさん、おかえりなさい。しかも2人になってるしw
>>> marxes.remove('Gummo') >>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo', 'Gummo']
find()のときと同じで、リストの最初から見て最初に該当したヤツを消す感じだね。
>>> marxes.remove('Gummo') >>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo']
Gummoさん、今度こそさようならw
引き続きまして、pop()を使った削除。
>>> marxes ['Groucho', 'Chico', 'Harpo', 'Zeppo'] >>> marxes.pop() 'Zeppo' >>> marxes ['Groucho', 'Chico', 'Harpo'] >>> marxes.pop(1) 'Chico' >>> marxes ['Groucho', 'Harpo'] >>>
pop()に引数を渡さない場合は、オフセットとして-1が使われる。つまり最後の要素を消す。append()でリストに追加し、pop()で消すと、Last In First Out(LIFO)なキューになるよと。
先入先出し法(FIFO)、後入先出法(LIFO)みたいな話だよね。大昔に習った簿記を思い出すw
(つづく)