今さらPython3 (13) - リストの続き 要素をいじってみる

この本の第3章を読み進めてます。

入門 Python 3

入門 Python 3

ミュータブル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

(つづく)