やり直しPython3(リスト、タプル、辞書、集合)

2016-04-04(Mon) by Makoto Yamahira

Python3の勉強(3) リスト、タプル、辞書、集合

Python基礎勉強3日目です。今回はリスト、タプル、辞書、集合について。

シーケンス

Pythonにはタプル・リストの2種類のシーケンスがある。
1. タプル(tuple) → イミュータブル(書きかえられない)
2. リスト(list) → ミュータブル(書きかえられる)

リスト

要素を順番に管理したいとき、順序と内容が変わる可能性がある場合はリストを使おう。 リストには新しい要素を追加したり、既存の要素を削除したり書き換えたりしたりすることができる。

リストの作り方

リストは[]またはlist()関数を使って作ることができる。

>>> empty_list = []
>>> kana_list = ['あ', 'か', 'さ', 'た', 'な']

>>> empty_list2 = list()
>>> empty_list2
[]

他の型をリストに変換

list()関数を使ってキャストできる。

>>> list('makohira')
['m', 'a', 'k', 'o', 'h', 'i', 'r', 'a']

要素へのアクセス

[offset]やスライスを使って要素にアクセスできる。

>>> kana_list = ['あ', 'か', 'た', 'な']
>>> kana_list[1]
'か'
>>> kana_list[1:3]
['か', 'た']
>>> kana_list[0] = 'い'
>>> kana_list
['い', 'か', 'た', 'な']

要素の追加

append()で要素を末尾に追加ができる。
extend()または「+=」でリストを末尾に追加ができる。
insert()で指定したオフセットの前に要素を追加できる。

>>> kana_list = ['か', 'さ', 'た']
>>> kana_list.append('な')  
>>> kana_list
['か', 'さ', 'た', 'な']  
>>> kana_list.extend(['は', 'ま', 'や'])
>>> kana_list
['か', 'さ', 'た', 'な', 'は', 'ま', 'や']
>>> kana_list += ['ら', 'わ']
>>> kana_list
['か', 'さ', 'た', 'な', 'は', 'ま', 'や', 'ら', 'わ']
>>> kana_list.insert(0, 'あ')
>>> kana_list
['あ', 'か', 'さ', 'た', 'な', 'は', 'ま', 'や', 'ら', 'わ']

要素の削除

Pythonのdel文で指定したオフセットの要素を削除できる。
remove()で指定した値の要素を削除できる。
pop()を使うと値の取り出しと削除が一度にできる。

>>> kana_list = ['あ', 'か', 'さ', 'た', 'な', 'は', 'ま', 'や', 'ら', 'わ']
>>> del kana_list[0]
>>> kana_list
['か', 'さ', 'た', 'な', 'は', 'ま', 'や', 'ら', 'わ']
>>> kana_list.remove('な')
>>> kana_list
['か', 'さ', 'た', 'は', 'ま', 'や', 'ら', 'わ']
>>> kana = kana_list.pop(1)
>>> kana
'さ'
>>> kana_list
['か', 'た', 'は', 'ま', 'や', 'ら', 'わ']
>>> kana2 = kana_list.pop()
>>> kana2
'わ'  (pop()を引数なしで呼び出すと「-1」が指定される。)
>>> kana_list
['か', 'た', 'は', 'ま', 'や', 'ら']

値の存在確認

値が存在しているかどうかを調べるにはPythonのinを使うと良い。

>>> kana_list = ['あ', 'か', 'さ', 'た', 'な']
>>> 'あ' in kana_list
True
>>> 'い' in kana_list
False

リストの関数(一部)

よく使う関数の一覧

関数 機能
index() 指定した値に対応するオフセットを取得
count() 指定した値がリスト内に何個含まれているか調べる
sort() そのリスト自体をソートする
sorted() ソートされたリストのコピーを返す
sort(reverse=True) 降順でソート
copy() リストのコピーを返す

タプル

タプルはリストと同様に任意の要素を集めたシーケンス。
リストとの違いはリストはミュータブル(編集可能)であるのに対し、タプルはイミュータブル(編集不可)であることだ。

タプルの作り方

タプルは個々の要素をカンマで区切ってつくる。

>>> kana_tuple = 'あ', 'い', 'う', 'え', 'お'
>>> kana_tuple
('あ', 'い', 'う', 'え', 'お')

分かりやすくするために両端に()をつけても良い

>>> kana_tuple = ('あ', 'い', 'う', 'え', 'お')
>>> kana_tuple
('あ', 'い', 'う', 'え', 'お')

他の型をタプルに変換

tuple()関数を使ってキャストできる。

>>> kana_list = ['あ', 'か', 'さ']
>>> kana_tuple = tuple(kana_list)
>>> kana_tuple
('あ', 'か', 'さ')

タプルのアンパック

タプルを使うと複数の変数に値を代入できる。

>>> kana1, kana2, kana3 = 'あ', 'い', 'う'
>>> kana1
'あ'
>>> kana2
'い'
>>> kana3
'う'

これを応用すると一時変数を使わずに値交換ができたりする。

>>> kana1 = 'あ'
>>> kana2 = 'い'
>>> kana3 = 'う'
>>> kana1, kana2, kana3 = kana3, kana2, kana1
>>> kana1
'う'
>>> kana2
'い'
>>> kana3
'あ'

関数の引数もタプルとして渡されているらしい。  

タプルを使うとき

シーケンスを利用したいとき、一般的にはほとんどの場合はリストを使う。
だけど次のメリットを生かしたい場合にはタプルを使うと良い。

  • タプルは消費スペースが小さい。
  • タプルの要素は誤って編集してしまう危険がない。
  • タプルは辞書のキーとして使える。

辞書

辞書はオフセットの代わりに一意なキーで値にアクセスするオブジェクトである。
キーにはイミュータブルなものならなんでも使える。(ほとんどの場合は文字列を使うけどね)
辞書には順番はない。

辞書の作り方

辞書は{key1: value1, key2: value2, ....}のように作ることができる。

>>> ej_dict = {'dog': 'いぬ', 'cat': 'ねこ', 'pig': 'ぶた'}
>>> ej_dict
{'dog': 'いぬ', 'cat': 'ねこ', 'pig': 'ぶた'}

要素へのアクセス

オフセットではなくキーでアクセスする。

>>> ej_dict = {'dog': 'いぬ', 'cat': 'ねこ', 'pig': 'ぶた'}
>>> ej_dict['dog']
'いぬ'

要素の追加・編集・削除

存在しないキーでアクセスすると要素の追加になる。

>>> ej_dict['human'] = '人間'
>>> ej_dict
{'dog': 'いぬ', 'cat': 'ねこ', 'pig': 'ぶた', 'human': '人間'}

すでに存在するキーでアクセスすると要素の編集になる。

>>> ej_dict['human'] = 'にんげん'
>>> ej_dict
{'dog': 'いぬ', 'cat': 'ねこ', 'pig': 'ぶた', 'human': 'にんげん'}

要素を削除したい場合はPythonのdel文が使える。

>>> del ej_dict['human']
>>> ej_dict
{'dog': 'いぬ', 'cat': 'ねこ', 'pig': 'ぶた'}

他の型を辞書に変換

次のような2要素のシーケンスはdict()関数で辞書にキャストできる。
2要素を作るのはタプルでもリストでも良い。(シーケンスならなんでもよい)

>>> list1 = [['pig', 'ぶた'], ['cat', 'ねこ'], ['dog', 'いぬ']]
>>> dict1 = dict(list1)
>>> dict1
{'pig': 'ぶた', 'cat': 'ねこ', 'dog': 'いぬ'}

>>> list2 = [('pig', 'ぶた'), ('cat', 'ねこ'), ('dog', 'いぬ')]
>>> dict2 = dict(list2)
>>> dict2
{'pig': 'ぶた', 'cat': 'ねこ', 'dog': 'いぬ'}

>>> list3 = ['ab', ('ぶた', 'pig'), ['num', 123]]
>>> dict3 = dict(list3)
>>> dict3
{'num': 123, 'ぶた': 'pig', 'a': 'b'}

zip()関数を使うと次のように辞書を作ることができる。

>>> key_list = ['pig', 'cat', 'dog']
>>> item_list = ['ぶた', 'ねこ', 'いぬ']
>>> ej_dict = dict(zip(key_list, item_list))
>>> ej_dict
{'pig': 'ぶた', 'cat': 'ねこ', 'dog': 'いぬ'}

辞書の関数(一部)

よく使う辞書の関数一覧。

関数 機能
clear() すべてのキーを削除
get() キーを指定して値を取得(キーが存在しない場合のデフォルトを指定できる)
values() 値のみの一覧を取得(dict_values型)
keys() キーのみの一覧を取得(dict_keys型)
items() キーと値の一覧をdict_list型で取得
copy() 辞書のコピーを作成
update() 他の辞書のキーと値をコピー

集合

集合は重複する要素をもたない、順序付けられていない要素の集まり。
数学的な集合演算をサポートしている。

集合の作り方

集合はカンマ区切りの値を波カッコで囲んで作る。

>>> color_set = {'red', 'yellow', 'green'}
>>> color_set
{'red', 'yellow', 'green'}

他の型を集合に変換

set()関数を使って集合にキャストできる。

>>> color_list = ['red', 'yellow', 'green']
>>> color_set = set(color_list)
>>> color_set
{'yellow', 'green', 'red'}

重複する値を含むものをキャストすると、重複は取り除かれる。

>>> color_list = ['red', 'yellow', 'green', 'red']
>>> color_set = set(color_list)
>>> color_set
{'yellow', 'green', 'red'}

集合演算

集合演算子を使って色々な集合を得ることができる。 たとえば「&」演算子を使うと積集合が得られる。

>>> color_set1 = {'red', 'yellow', 'green'}
>>> color_set2 = {'red', 'white', 'yellow'}
>>> color_set1 & color_set2
{'yellow', 'red'}

intersection()関数を使っても積集合を計算できる。

>>> color_set1.intersection(color_set2)
{'yellow', 'red'}

集合演算子、関数について次にまとめる。

集合演算子 関数 機能
& intersection() 積集合を得る
| union() 和集合を得る
- difference() 差集合を得る
^ symmetric_difference() 排他的OR集合を得る
<= issubset() 部分集合のチェック
< 真部分集合のチェック
>= issuperset() 上位集合のチェック
> 真上位集合のチェック

名前付きタプル

名前付きタプルを使うとオフセットだけでなくドット記法で要素にアクセスできる。
collectionsモジュールをインポートして利用する。

>>> from collections import namedtuple
>>> Man = namedtuple('Man', 'name gender age')
>>> makohira = Man('makohira', 'male', 39)      # 変数名を使って初期化する
>>> makohira
Man(name='makohira', gender='male', age=39)
>>> makohira.name
'makohira'
>>> makohira[1]
'male'

勉強に使っている本はオライリーの「入門Python3」


Comments