初心者メモ：PythonのList/Tuple/Set/Dictのチートシート


# はじめに

こんにちわ！Python入門中の石田です。あれこれ本を読んで勉強しているのですが、List->Tuple->Set->Dict　...と進んでいくうちに「あれ、この機能はListだと何だっけ?」とか「Listの追加はappend()だけどSetの追加はadd()かよ！」とか、元々物覚えの悪い頭が更に混乱してきました。ので４つの代表的なデータ構造を自分なりにExcelにチートシートの形でまとめてみたのですが、qiitaにも置いておこうと思ったので公開させて頂きます。基本、自分用のメモのつもりですが、タイポや誤り指摘・アドバイスなどいただけたら有難く。

- 環境:Python 3.6.4
- 初回執筆時点:2018/2/11 (随時更新) 
- 2018/2/12 shiracamusさんの補足・アドバイスを反映
- 2020/12/10 [@tomoykさんのアドバイス](https://qiita.com/ishida330/items/9692836aa860b2d0c36c#comment-a579d20a4904848b5485)を反映


# チートシート
(テーブル幅の関係で一部読みづらくてすいません）

| |list|tuple|set|dictionary|
|:---|:---|:---|:---|:---|
|123456789012|12345678901234567|12345678901234567|12345678901234567|12345678901234567|
|要素の順番(order)|あり(シーケンス)|あり(シーケンス)|なし|3.7～あり [※注](https://qiita.com/ishida330/items/9692836aa860b2d0c36c#comment-a579d20a4904848b5485)|
|変更|可(Mutable)|不可(Immutable)|可(Mutable)|可(Mutable)|
|重複|要素の重複を許容する|要素の重複を許容する|要素の重複を許容しない|キーの重複を許容しない<br>値の重複を許容する|
|補足|辞書のキーにできない<br>setの要素にできない|listよりメモリ使用量~~スペース~~が少ない<br>辞書のキーにできる<br>setの要素にできる<br>簡易的なClassの代わりにnamed tuplesが使える|集合演算が可能<br>要素はユニーク<br>追加・置換はUpsert<br>listやtupleの重複排除に利用可|keyはユニークであること<br>keyが重複した場合は値を上書き(upsert)|
|空の状態での作成|l1 = list()<br>l1 = []|t1 = tuple()<br>t1 = ()|s1 = set()|d1 = dict()<br>d1 = {}|
|初期化|l1 =['a', 'b','c']|t1 = ('a','b','c')<br>t1 = 'a', 'b', 'c'<br>#一要素ではカンマを忘れずに<br>t1 = ('a',) <br>t1 = 'a', |s1 = {'a', 'b', 'c'}|d1 = {'a': 1, 'b': 2, 'c': 3}|
|初期化<br>(Class指定)|l1 = list(['a', 'b', 'c'])<br>l1 = list(('a', 'b', 'c'))|t1 = tuple(('a', 'b', 'c'))<br>t1 = tuple(['a', 'b', 'c'])|s1 = set({'a', 'b', 'c'})<br>s1 = set(['a', 'b', 'c'])<br>s1 = set(('a', 'b', 'c'))|d1 = dict(a=1, b=2, c=3)<br>d1 = dict({'a':1, 'b':2, 'c':3})<br>d1 = dict((('a',1), ('b',2), ('c',3)))|
|要素数の取得|len(l1)|len(t1)|len(s1)|len(d1)|
|追加|# 末尾へ<br>l1.append('d')<br>l1 += ['d']<br># 特定の位置へ<br>l1.insert(1, 'e')<br>l1[1:1] = 'e'|-|s1.add('d')<br> s1 &#124;= {'d'}|d1[key] = val<br>d1.update({'e': 4})<br>d1.update(e=4)<br>d1.update(dict(e=4))|
|置換|l1 = ['a', 'b', 'c']<br>l1[2] = 'x'<br>#無いとIndexError<br>l1[9] = 'x'<br>#これはOK(末尾追加)<br> l1[9:] = 'x'|-|追加と同じ(upsert)|追加と同じ(upsert)|
|削除( by Position )|del l1[2]|-|-|-|
|削除( by Value )|l1.remove('a')|-|s1.remove('d')<br>s1 -= {'d'}|-|
|削除( by Key )|-|-|-|del d1[key]|
|削除( 全件クリア )|l1.clear()<br>del l1[:]|# 無理矢理だが<br>t1 = tuple()|s1.clear()<br>s1 = set()|d1.clear()<br>d1 = {}|
|要素の参照<br>(スライス)|# start<br>l1[0]<br># start:end<br>l1[0:2]<br># last<br>l1[-1]<br># by 2<br>l1[::2]|listと同じ|-|-|
|取得&削除|# デフォ＝末尾から(-1)<br># 無いとIndexError<br>l1.pop() <br># 位置指定<br>l1.pop(2) |-|#無いとKeyError<br>s1.pop('a') <br># 無いとdefault<br>s1.pop('a', default) |# 無いとKeyError<br>d1.pop(key) <br># 無いとdefault<br>d1.pop(key, default) |
|LIFO(Stack)|#追加<br>append()<br>#取り出し(pop(-1)と同じ)<br>pop() |-|-|-|
|FIFO(Queue)|#追加<br>append()<br>#取り出し<br>pop(0)|-|-|-|
|要素の位置を取得|l1.index('b')|listと同じ|-|-|
|存在チェック|#True/False<br>'a' in l1 |listと同じ|listと同じ|key in d1 #True/False<br>val in d1.values()  #True/False|
|二次元|l1 =[[1,2],[3,4],[5,6]]<br># 要素の参照<br>l1[1][2]|t1 = ((1,2),(3,4),(5,6))<br># 要素の参照<br>t1[1][1]|s1 = {(1,2), (3,4)}<br>#setの入れ子は**不可**<br>× s1 = {{1, 2}, {3, 4}}|# valにdictを格納可能<br>d1 = {'a': {'x': 1}, 'b': {'y': 2}}|
|マージ|l1 = [1,2,3]<br>l2 = [4,5,6]<br>l1.extend(l2)|-|s1 = {1, 2, 3}<br>s2 = {4, 5, 6}<br>s3 = s1.union(s2)|d1 = {'a': 1, 'b': 2}<br>d2 = {'b': 9, 'c':3}<br>d1.update(d2)<br>※key重複時は後者(d2)の値を反映|
|マージ(2)|l1 = ['a','b','c']<br>l2 = ['d', 'e', 'f']<br>l1 +=l2<br># これは結果が異なる<br>l1 = ['a','b']<br>l2 = ['c', 'd']<br>l1.append(l2)<br>--> ['a', 'b', ['c', 'd']]|t1 = (1, 2, 3)<br>t2 = (4, 5, 6)<br>t3 = t1 + t2|s1 = {1, 2, 3}<br>s2 = {4, 5, 6}<br>s3 = s1 &#124; s2|-|
|特定の値を持つ要素の数を取得|l1.count('a')|t1.count('a')|-|d1 = {'a': 3, 'b': 2, 'c': 1, 'd': 3}<br>len({k: v for k, v in d1.items() if v == 3})<br>---<br>sum(v == 3 for v in d1.values())|
|ソート<br>(破壊的)|l1.sort()<br>l1.sort(reverse=True)|-|-|-|
|ソート<br>(非破壊的)|l2 = sorted(l1)|# sorted()=>list<br>t2 = tuple(sorted(t1))|# sorted()=>list<br>s2 = set(sorted(s1))<br># 用途??| d2 = sorted(d1.items(), key=lambda x: x[1])|
|並び順を逆に<br>(破壊的)|l1.reverse()|-|-|-|
|並び順を逆に<br>(非破壊的)|l2 = reversed(l1)<br>l2 = l1[::-1]|t2 = tuple(reversed(t1))<br>t2 = t1[::-1]|-|-|
|コピー(浅い)|a = [1, 2, 3]<br>b=a|a = (1, 2, 3)<br>b = a<br>---<br>import copy<br>a = (1, 2, 3)<br>b = copy.copy(a)|a = {1, 2, 3}<br>b = a|a = {'a': 1, 'b': 2, 'c': 3}<br>b = a|
|コピー(深い)|a = [1, 2, 3]<br>b = a.copy()<br>---<br>c = list(a)<br>---<br>d = a[:]|import copy<br>a = (1, 2, 3)<br>b = copy.deepcopy(a)<br>---<br>c = tuple(a)<br>---<br>d = a[:]|a = {1, 2, 3}<br>b = a.copy()<br>---<br>c = set(a)|a = {'a': 1, 'b': 2, 'c': 3}<br>b = a.copy()|
|値の合計|sum(l1)|listと同じ|listと同じ|sum(d1.keys())<br>sum(d1.values())|
|値の最大|max(l1)|listと同じ|listと同じ|max(d1.keys())<br>max(d1.values())|
|値の最小|min(l1)|listと同じ|listと同じ|min(d1.keys())<br>min(d1.values())|
|変換(Stringへ)| l1 = ['a', 'b', 'c']<br>','.join(l1)<br>--> a,b,c|listと同じ|listと同じ|','.join(d1.keys()) ><br>','.join(d1.values())|
|変換(Listへ)|-|list(t1)|list(s1)|list(d1.keys())<br>list(d1.values())|
|変換(Tupleへ)|tuple(l1)|-|tuple(s1)|tuple(d1.keys())<br>tuple(d1.values())<br>tuple(d1.items())|
|変換(Setへ)|set(l1)|set(t1)|-|set(d1.keys())<br>set(d1.values())<br>set(d1.items())|
|変換(Dictへ)|l1 = [['a', 'b'], ['c', 'd'], ['e', 'f']]<br>d1 = dict(l1)<br>---<br>k = ['a', 'b', 'c']<br>v = [1, 2, 3]<br>d1 = dict(zip(k, v))<br>|t1 = (('a', 'b'), ('c', 'd'), ('e', 'f'))<br>d1 = dict(t1)|s1 = {('a',1),('b',2),('c', 3)}<br>d1 = dict(s1))<br>---<br>s1 = {'a', 'b', 'c'}<br>s2 = {1, 2, 3}<br>d1 = dict(zip(s1, s2))|-|
|複数のシーケンスから<br>順番に取り出し|zip(l1,l2)|listと同じ|zip(s1,s2)は可能だが<br>組や順番は未保証<br>s1 = {'a', 'b', 'c'}<br>s2 = {1, 2, 3}<br>l3 = zip(s1, s2)<br>--> {('a', 1), ('c', 3), ('b', 2)}|-|
|内包表記|[x for x in l1]|tuple(x for x in t1)|{x for x in s1}|{k: v for k, v in d1.items()}|
|mutableな<br>オブジェクトの格納|可能<br>l1 =['a', [1, 2, 3]]|可能<br>t1 = ('a', [1, 2, 3])|不可<br>s1 = {'a', [1, 2, 3]}<br>-->TypeError|Keyは不可(Type Error)<br> d1 = {[1, 2, 3]: 1}<br>Valueは可能<br>d1 = {'a': [1, 2, 3]}|
|集合演算(和)|-|-|s1 &#124; s2  <br>s1.union(s2)|-|
|集合演算(差)|-|-|s1 - s2<br>s1.difference(s2)|-|
|集合演算(積)|-|-|s1 & s2<br>s1.intersection(s2)|-|
|集合演算(対象差)|-|-|s1 ^ s2><br>s1.symmetric_<br>difference(s2)|-|
|キーによる参照|-|-|-|#キーが無いとKeyError発生<br>d1[key]<br>#無いとNoneが返る<br>d1.get(key) <br>#無いとdefaultが返る<br>d1.get(key,default)|
|キーの取得とループ|-|-|-|d1.keys()<br>for key in d1.keys():|
|値の取得とループ|-|-|-|d1.values()<br>for val in d1.values():|
|キー&値ペアの<br>取得とループ|-|-|-|# ( k, v )のペアがtupleで戻る<br>d1.items() <br>for key, value in d1.items():|
|キーと値の入れ替え|-|-|-|d2 = {v: k for k, v in d1.items()}|