Python : データ構造

参考書籍 : Python実践入門, Python3スキルアップ教科書

・None : 値が存在しないことを表現する特殊な値
Noneはシングルトンなので、None is NoneはTrue


・文字列

# 文字列に演算子を使える
print("Hello " + "World!")  # 文字列の演算
# 文字列はイテラブル、取り出される一つずつもまた文字列
for c in "abcd": 
    print(c)
# 文字列に変数を埋め込む方法4種類
title = "book"
print(f"python practice {title}")  # 文字列内へ変数を埋め込む
print(f"{title.upper()=}")  # 文字列内の変数や式に=をつけると、変数や式と評価結果を文字列にできる
print("python practice {}".format(title))  # Python2.6から使えるformatを使ったやり方
print("python practice %s" % (title))  # %を使う方法、非推薦


・list
リストの作成方法

# []で作る方法と、list()にイテラブルなオブジェクト渡す方法がある
items = ["note", "notebook", "sketchbook"]
book = list("book")  # ['b', 'o', 'o', 'k']

リストの演算や関数の例

items.append("paperbook")  # 末尾に追加
items = items + ["book"] + ["comic"]  # リストの結合
items.pop(0)  # 削除、引数は削除するインデックス
del items[0] # del文での削除

リストへのアクセス。インデックスでのアクセスと、スライスでのアクセス

items[-2]  # 末尾から2つ目、インデックスでアクセス
items[0:len(items):2]  # 0から末尾まで2つおき、スライスでアクセス

インデックスは↓の図がわかりやすい
f:id:kamishiroHW:20200506011554p:plain


・tuple : あとから要素の追加や削除ができないコンテナ
タプルの作成方法

# ()や,で作る方法と、tuple()にイテラブルなオブジェクト渡す方法がある
items = ("note", "notebook", "sketchbook")
items = "note", "notebook", "sketchbook"  # ()はなくても良い
item = (1,)  # 要素が1のtupleはカンマをつける
item = "note",  # tupleになってしまうので注意
items = tuple(["note", "notebook", "sketchbook"])

タプルへのアクセスも、インデックスとスライスでアクセスできる

items[-2]  # tupleもインデックス、スライスでアクセスできる
items[0:2]


・set : 一意な要素の集合を管理するコンテナ、順序を持たない
setの作成方法

# {}で作成する方法と、set()にイテラブルなオブジェクト渡す方法がある
items = {"note", "notebook", "sketchbook"}
items = set(["note", "notebook", "sketchbook"])
items = {"note", "note", "notebook", "sketchbook"}  # 重複した要素は一つになる
# {'notebook', 'sketchbook', 'note'}
items = {} # これは空のdictになるので注意

setの操作

items.add("comic")
items.pop()  # 要素の削除、順序がないので削除される要素は不定
# items[0] # 順序がないためインデックスでアクセスできない

# 集合演算
set_a = {"note", "notebook", "sketchbook"}
set_b = {"book", "rulebook", "sketchbook"}
print(set_a | set_b) # 和集合 {'rulebook', 'note', 'book', 'notebook', 'sketchbook'}
print(set_a - set_b)  # 差集合 {'note', 'notebook'}
print(set_a & set_b)  # 積集合 {'sketchbook'}
print(set_a ^ set_b)  # 対象差 {'book', 'note', 'notebook', 'rulebook'}


・frozenset : 不変なset
frozensetの作成

items = frozenset(["note", "notebook", "sketchbook"])  # frozenset()のみで作成できる

frozensetも集合演算を行える


・dict : キーと値の組み合わせを扱う辞書コンテナ
dictの作成方法

# {}で作成する方法と、dictを使う方法がある
items = {"note": 1, "notebook": 2, "sketchbook": 3}
items = dict(note=1, notebook=2, sketchbook=3)  # dict()での作成
items = {} # 空のdict
items = {("book",): 1}  # 数値、文字列、タプルなど不変なオブジェクトはキーにできる

dictの操作

items["book"] = 4  # 要素の追加
items.pop("notebook")  # 要素の削除
del items["sketchbook"] # del文での削除
items.get("comic")  # dict.get()での取得なら存在しない要素でもKeyError例外にならない

dictをfor文で使う
dict.items()を使いkeyとvalueを取得できる

items = {"note": 1, "notebook": 2, "sketchbook": 3}
for k, v in items.items():  # keyとvalue
    print(k + " " + str(v), end=" ")

dict.keys()でkeyのみ、dict.values()でvalueのみを取り出せる


・内包表記
内包表記を利用することで、簡潔にコンテナを作成できる
リスト内包表記の場合、[リストの要素 for 変数 in イテラブル]と書く

items = [i * 2 for i in range(10)]

if節を追加して、作成する要素に条件をつけられる

items = [i * 2 for i in range(10) if i % 2 == 0]

タプル、集合、辞書も内包表記で作成できる

items = tuple(i * 2 for i in range(10)) # tuple
items = {i * 2 for i in range(10)} # set
items = {str(i): i * 2 for i in range(10)} # dict

タプルの内包表記を書こうとして、()を使ってしまうとジェネレータ式になってしまうので注意