ひさふぃの日記

DjangoとPythonとLaravelが好き。大阪でフリーランスエンジニアやってます。

入門Python3のメモ 3章|リスト、タプル、辞書、集合

Pythonの入門書として各所でオススメされている入門Python3。

shikouno.hatenablog.com

前半7章までで基本をおさらいし、後半8章からは他分野で活用できそうなちょっとした応用編がオールインワン。みんなのPython 第4版の次に読むとちょうどいいレベル感。

購入後にかいつまんでパラパラ読みはしていたのですが、まとまった時間が取れそうだったので一気通読しようかと思い立ちました。

その際、初めて知る箇所や曖昧でいつも検索する箇所を後で見返せるようにメモしておこうかと。

そのため、このメモは僕の知識的偏りから生み出されたものであることを最初にお断りしておきます。気になった方は書籍を購入してください。

入門 Python 3

ちなみに、1章は導入なのでメモがありませんが、1.2 Pythonと多言語の比較は面白いので必見!著者の冗談も随所に入っていて、面白くていい本です。

英語版はPDFが無料で公開されています。よろしければ!

Introducing Python

入門Python3のメモ 2章|数値、文字列、変数 - シコウノキロク

リスト

オフセットによる要素の書き換え

  • 3.2.5 [offset]による置き換え

文字列と異なりオフセットを指定して要素を置き換えることができます。

>>> hoge = [ str(x) for x in range(1, 5)]
>>> hoge[1] = "two"
>>> hoge
['1', 'two', '3', '4']

要素の追加

  • 3.2.7 append()による末尾への要素の追加
  • 3.2.8 extend()または+=を使ったリストの結合
  • 3.2.9 insert()によるオフセットを指定した要素の追加

appendは末尾に要素を追加する関数で、insertは位置を指定できるappend関数。それ以外の振る舞いは同じ。 extendと+=は全く同じ振る舞い。

以下はappendとextendを比較しています。

数値を追加する場合、appendは追加されますが、extendはエラーになります。数値はイテラブルじゃないとのこと。

appendはそのまま追加し、extendは引数をイテレートしています。要はループ処理みたいなこと。

>>> hoge = [ x for x in range(1, 5)]
>>> hoge.append(5)
>>> hoge.extend(6)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable

イテラブルな文字列やリストを引数に追加する場合は結果が全く異なるので要注意ですね。

>>> hoge.append('six')
>>> hoge
[1, 2, 3, 4, 5, 'six']
>>> hoge.extend('six')
>>> hoge
[1, 2, 3, 4, 5, 'six', 's', 'i', 'x']
>>> hoge.append([7, 8])
>>> hoge
[1, 2, 3, 4, 5, 'six', 's', 'i', 'x', [7, 8]]
>>> hoge.extend([7, 8])
>>> hoge
[1, 2, 3, 4, 5, 'six', 's', 'i', 'x', [7, 8], 7, 8]

要素の削除

  • 3.2.10 delによる指定したオフセットの要素の削除
  • 3.2.11 remove()による値に基づく要素の削除
  • 3.2.12 pop()でオフセットを指定して要素を取り出し、削除する方法

オフセット指定で削除するのが、delとpop()。delは文で、popはメソッド。使い分けがあった…はず。後々出てくるかも。 値指定で削除するのがremove。こちらはメソッド。

>>> hoge = [ x for x in range(1, 5)]
>>> del hoge[-1]
>>> hoge
[1, 2, 3]
>>> hoge.pop(-1)
3
>>> hoge
[1, 2]
>>> hoge.remove(1)
>>> hoge
[2]

あまり使ったことがないけど便利そうなメソッド

  • 3.2.13 index()により要素の値から要素のオフセットを知る方法
  • 3.2.15 count()を使った値の個数の計算
  • 3.2.17 sort()による要素の並べ替え

indexは値指定して、リストのオフセット位置を出力する。 countは値指定して、リスト内の値の個数を調べる。 sortは、リストの順番を並べ替えます。降順にしたい場合はオフセットを使うとスマート。

>>> import random
>>> hoge = [ random.randint(1,10) for x in range(10)]
>>> hoge
[10, 9, 5, 10, 1, 4, 7, 4, 1, 2]
>>> hoge.index(2)
9
>>> hoge.count(4)
2
>>> hoge.sort()
>>> hoge
[1, 1, 2, 4, 4, 5, 7, 9, 10, 10]
>>> hoge = hoge[::-1]
>>> hoge
[10, 10, 9, 7, 5, 4, 4, 2, 1, 1]

代入とコピー

  • 3.2.19 =による代入とcopy()によるコピー

=で代入した場合、代入先のリストと元のリストが連動する。 copy()、list()、リストのスライスを用いて代入した場合、独立したリストが得られる。

実際に活用する時はリストのスライスが直感的で楽そうですね。速度も早かったはず。

>>> origine = [ x for x in range(1, 5)]
>>> copy = origine
>>> origine[0] = 'one'
>>> copy
['one', 2, 3, 4]

>>> origine = [x for x in range(1,5)]
>>> copy1 = origine.copy()
>>> copy2 = list(origine)
>>> copy3 = origine[:]
>>> origine[0] = "one"
>>> copy1
[1, 2, 3, 4]
>>> copy2
[1, 2, 3, 4]
>>> copy3
[1, 2, 3, 4]

辞書

結合と削除

  • 3.4.4 update()による辞書の結合
  • 3.4.5 delによる指定したキーを持つ要素の削除

updateは処理対象の辞書に引数の中身を追加します。同一のキーがある場合、引数の方が優先されます。 delはキーを指定して、キーと値を削除します。

>>> di1 = { x:x for x in range(1,5)}
>>> di2 = { x:x*2 for x in range(4,8)}
>>> di1
{1: 1, 2: 2, 3: 3, 4: 4}
>>> di2
{4: 8, 5: 10, 6: 12, 7: 14}
>>> di1.update(di2)
>>> di1
{1: 1, 2: 2, 3: 3, 4: 8, 5: 10, 6: 12, 7: 14}
>>> del di1[1]
>>> di1
{2: 2, 3: 3, 4: 8, 5: 10, 6: 12, 7: 14}

キー・値の取得

  • 3.4.7 inを使ったキーの有無のテスト
  • 3.4.8 [key]による要素の取得
  • 3.4.9 keys()によるすべてのキーの取得
  • 3.4.10 values()によるすべての値の取得
  • 3.4.11 items()によるすべてのキー/値ペアの取得

各節のタイトル通りですね。inはキーを取得します。

dict[key]にて指定したキーが辞書になければ例外が発生する。これを避けるためにget関数を使うのが良い方法である。

>>> di1
{2: 2, 3: 3, 4: 8, 5: 10, 6: 12, 7: 14}
>>> hoge = [x for x in di1]
>>> hoge
[2, 3, 4, 5, 6, 7]
>>> di1.get(1, "not exist")
'not exist'
>>> di1.get(5, "not exist")
10
>>> list(di1.keys())
[2, 3, 4, 5, 6, 7]
>>> list(di1.values())
[2, 3, 8, 10, 12, 14]
>>> list(di1.items())
[(2, 2), (3, 3), (4, 8), (5, 10), (6, 12), (7, 14)]

代入とコピー

  • 3.4.12 =による代入とcopy()によるコピー

リストと同じですね。スライスが使えないため、copy関数かdict関数を用いることで独立した辞書を作成することができます。

>>> origine = { x:x for x in range(1,5)}
>>> origine
{1: 1, 2: 2, 3: 3, 4: 4}
>>> di = origine
>>> origine[1] = "one"
>>> di
{1: 'one', 2: 2, 3: 3, 4: 4}

>>> origine = { x:x for x in range(1,5)}
>>> di1 = origine.copy()
>>> di2 = dict(origine)
>>> origine[1] = "one"
>>> di1
{1: 1, 2: 2, 3: 3, 4: 4}
>>> di2
{1: 1, 2: 2, 3: 3, 4: 4}
>>> origine
{1: 'one', 2: 2, 3: 3, 4: 4}

集合

積集合・和集合・差集合

  • 3.5.4 組み合わせと演算

セットを使うことによって集合の演算を行うことができます。

積集合は"&“とintersection()関数、和集合は”|“とunion()関数、差集合は”-“とdefference()関数。

演算子を用いるパターンと関数を用いるパターンがありますが、実装する時は直感的な演算子を用いる方が多そうですね。

>>> a = {x for x in range(1,5)}
>>> a
{1, 2, 3, 4}
>>> b = {x for x in range(3,7)}
>>> b
{3, 4, 5, 6}

>>> a & b
{3, 4}
>>> a.intersection(b)
{3, 4}
>>> a | b
{1, 2, 3, 4, 5, 6}
>>> a.union(b)
{1, 2, 3, 4, 5, 6}
>>> a - b
{1, 2}
>>> a.difference(b)
{1, 2}

さいごに

3章はシーケンスでメモがすごいボリュームになってしまいました。

タプルに関してはメモ書きがありませんが、アンパックで結構使っていますね。ただ、タプルとして意識することはないでしょう。

最後までお読みいただきありがとうございました。それじゃ!

入門 Python 3

入門 Python 3