はじめに
こんにちわ!Python入門中の石田です。あれこれ本を読んで勉強しているのですが、List->Tuple->Set->Dict ...と進んでいくうちに「あれ、この機能はListだと何だっけ?」とか「Listの追加はappend()だけどSetの追加はadd()かよ!」とか、元々物覚えの悪い頭が更に混乱してきました。ので4つの代表的なデータ構造を自分なりにExcelにチートシートの形でまとめてみたのですが、qiitaにも置いておこうと思ったので公開させて頂きます。基本、自分用のメモのつもりですが、タイポや誤り指摘・アドバイスなどいただけたら有難く。
- 環境:Python 3.6.4
- 初回執筆時点:2018/2/11 (随時更新)
- 2018/2/12 shiracamusさんの補足・アドバイスを反映
- 2020/12/10 @tomoykさんのアドバイスを反映
チートシート
(テーブル幅の関係で一部読みづらくてすいません)
list | tuple | set | dictionary | |
---|---|---|---|---|
123456789012 | 12345678901234567 | 12345678901234567 | 12345678901234567 | 12345678901234567 |
要素の順番(order) | あり(シーケンス) | あり(シーケンス) | なし | 3.7~あり ※注 |
変更 | 可(Mutable) | 不可(Immutable) | 可(Mutable) | 可(Mutable) |
重複 | 要素の重複を許容する | 要素の重複を許容する | 要素の重複を許容しない | キーの重複を許容しない 値の重複を許容する |
補足 | 辞書のキーにできない setの要素にできない |
listよりメモリ使用量 辞書のキーにできる setの要素にできる 簡易的なClassの代わりにnamed tuplesが使える |
集合演算が可能 要素はユニーク 追加・置換はUpsert listやtupleの重複排除に利用可 |
keyはユニークであること keyが重複した場合は値を上書き(upsert) |
空の状態での作成 | l1 = list() l1 = [] |
t1 = tuple() t1 = () |
s1 = set() | d1 = dict() d1 = {} |
初期化 | l1 =['a', 'b','c'] | t1 = ('a','b','c') t1 = 'a', 'b', 'c' #一要素ではカンマを忘れずに t1 = ('a',) t1 = 'a', |
s1 = {'a', 'b', 'c'} | d1 = {'a': 1, 'b': 2, 'c': 3} |
初期化 (Class指定) |
l1 = list(['a', 'b', 'c']) l1 = list(('a', 'b', 'c')) |
t1 = tuple(('a', 'b', 'c')) t1 = tuple(['a', 'b', 'c']) |
s1 = set({'a', 'b', 'c'}) s1 = set(['a', 'b', 'c']) s1 = set(('a', 'b', 'c')) |
d1 = dict(a=1, b=2, c=3) d1 = dict({'a':1, 'b':2, 'c':3}) d1 = dict((('a',1), ('b',2), ('c',3))) |
要素数の取得 | len(l1) | len(t1) | len(s1) | len(d1) |
追加 | # 末尾へ l1.append('d') l1 += ['d'] # 特定の位置へ l1.insert(1, 'e') l1[1:1] = 'e' |
- | s1.add('d') s1 |= {'d'} |
d1[key] = val d1.update({'e': 4}) d1.update(e=4) d1.update(dict(e=4)) |
置換 | l1 = ['a', 'b', 'c'] l1[2] = 'x' #無いとIndexError l1[9] = 'x' #これはOK(末尾追加) l1[9:] = 'x' |
- | 追加と同じ(upsert) | 追加と同じ(upsert) |
削除( by Position ) | del l1[2] | - | - | - |
削除( by Value ) | l1.remove('a') | - | s1.remove('d') s1 -= {'d'} |
- |
削除( by Key ) | - | - | - | del d1[key] |
削除( 全件クリア ) | l1.clear() del l1[:] |
# 無理矢理だが t1 = tuple() |
s1.clear() s1 = set() |
d1.clear() d1 = {} |
要素の参照 (スライス) |
# start l1[0] # start:end l1[0:2] # last l1[-1] # by 2 l1[::2] |
listと同じ | - | - |
取得&削除 | # デフォ=末尾から(-1) # 無いとIndexError l1.pop() # 位置指定 l1.pop(2) |
- | #無いとKeyError s1.pop('a') # 無いとdefault s1.pop('a', default) |
# 無いとKeyError d1.pop(key) # 無いとdefault d1.pop(key, default) |
LIFO(Stack) | #追加 append() #取り出し(pop(-1)と同じ) pop() |
- | - | - |
FIFO(Queue) | #追加 append() #取り出し pop(0) |
- | - | - |
要素の位置を取得 | l1.index('b') | listと同じ | - | - |
存在チェック | #True/False 'a' in l1 |
listと同じ | listと同じ | key in d1 #True/False val in d1.values() #True/False |
二次元 | l1 =[[1,2],[3,4],[5,6]] # 要素の参照 l1[1][2] |
t1 = ((1,2),(3,4),(5,6)) # 要素の参照 t1[1][1] |
s1 = {(1,2), (3,4)} #setの入れ子は不可 × s1 = {{1, 2}, {3, 4}} |
# valにdictを格納可能 d1 = {'a': {'x': 1}, 'b': {'y': 2}} |
マージ | l1 = [1,2,3] l2 = [4,5,6] l1.extend(l2) |
- | s1 = {1, 2, 3} s2 = {4, 5, 6} s3 = s1.union(s2) |
d1 = {'a': 1, 'b': 2} d2 = {'b': 9, 'c':3} d1.update(d2) ※key重複時は後者(d2)の値を反映 |
マージ(2) | l1 = ['a','b','c'] l2 = ['d', 'e', 'f'] l1 +=l2 # これは結果が異なる l1 = ['a','b'] l2 = ['c', 'd'] l1.append(l2) --> ['a', 'b', ['c', 'd']] |
t1 = (1, 2, 3) t2 = (4, 5, 6) t3 = t1 + t2 |
s1 = {1, 2, 3} s2 = {4, 5, 6} s3 = s1 | s2 |
- |
特定の値を持つ要素の数を取得 | l1.count('a') | t1.count('a') | - | d1 = {'a': 3, 'b': 2, 'c': 1, 'd': 3} len({k: v for k, v in d1.items() if v == 3}) --- sum(v == 3 for v in d1.values()) |
ソート (破壊的) |
l1.sort() l1.sort(reverse=True) |
- | - | - |
ソート (非破壊的) |
l2 = sorted(l1) | # sorted()=>list t2 = tuple(sorted(t1)) |
# sorted()=>list s2 = set(sorted(s1)) # 用途?? |
d2 = sorted(d1.items(), key=lambda x: x[1]) |
並び順を逆に (破壊的) |
l1.reverse() | - | - | - |
並び順を逆に (非破壊的) |
l2 = reversed(l1) l2 = l1[::-1] |
t2 = tuple(reversed(t1)) t2 = t1[::-1] |
- | - |
コピー(浅い) | a = [1, 2, 3] b=a |
a = (1, 2, 3) b = a --- import copy a = (1, 2, 3) b = copy.copy(a) |
a = {1, 2, 3} b = a |
a = {'a': 1, 'b': 2, 'c': 3} b = a |
コピー(深い) | a = [1, 2, 3] b = a.copy() --- c = list(a) --- d = a[:] |
import copy a = (1, 2, 3) b = copy.deepcopy(a) --- c = tuple(a) --- d = a[:] |
a = {1, 2, 3} b = a.copy() --- c = set(a) |
a = {'a': 1, 'b': 2, 'c': 3} b = a.copy() |
値の合計 | sum(l1) | listと同じ | listと同じ | sum(d1.keys()) sum(d1.values()) |
値の最大 | max(l1) | listと同じ | listと同じ | max(d1.keys()) max(d1.values()) |
値の最小 | min(l1) | listと同じ | listと同じ | min(d1.keys()) min(d1.values()) |
変換(Stringへ) | l1 = ['a', 'b', 'c'] ','.join(l1) --> a,b,c |
listと同じ | listと同じ | ','.join(d1.keys()) > ','.join(d1.values()) |
変換(Listへ) | - | list(t1) | list(s1) | list(d1.keys()) list(d1.values()) |
変換(Tupleへ) | tuple(l1) | - | tuple(s1) | tuple(d1.keys()) tuple(d1.values()) tuple(d1.items()) |
変換(Setへ) | set(l1) | set(t1) | - | set(d1.keys()) set(d1.values()) set(d1.items()) |
変換(Dictへ) | l1 = [['a', 'b'], ['c', 'd'], ['e', 'f']] d1 = dict(l1) --- k = ['a', 'b', 'c'] v = [1, 2, 3] d1 = dict(zip(k, v)) |
t1 = (('a', 'b'), ('c', 'd'), ('e', 'f')) d1 = dict(t1) |
s1 = {('a',1),('b',2),('c', 3)} d1 = dict(s1)) --- s1 = {'a', 'b', 'c'} s2 = {1, 2, 3} d1 = dict(zip(s1, s2)) |
- |
複数のシーケンスから 順番に取り出し |
zip(l1,l2) | listと同じ | zip(s1,s2)は可能だが 組や順番は未保証 s1 = {'a', 'b', 'c'} s2 = {1, 2, 3} l3 = zip(s1, s2) --> {('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な オブジェクトの格納 |
可能 l1 =['a', [1, 2, 3]] |
可能 t1 = ('a', [1, 2, 3]) |
不可 s1 = {'a', [1, 2, 3]} -->TypeError |
Keyは不可(Type Error) d1 = {[1, 2, 3]: 1} Valueは可能 d1 = {'a': [1, 2, 3]} |
集合演算(和) | - | - | s1 | s2 s1.union(s2) |
- |
集合演算(差) | - | - | s1 - s2 s1.difference(s2) |
- |
集合演算(積) | - | - | s1 & s2 s1.intersection(s2) |
- |
集合演算(対象差) | - | - | s1 ^ s2> s1.symmetric_ difference(s2) |
- |
キーによる参照 | - | - | - | #キーが無いとKeyError発生 d1[key] #無いとNoneが返る d1.get(key) #無いとdefaultが返る d1.get(key,default) |
キーの取得とループ | - | - | - | d1.keys() for key in d1.keys(): |
値の取得とループ | - | - | - | d1.values() for val in d1.values(): |
キー&値ペアの 取得とループ |
- | - | - | # ( k, v )のペアがtupleで戻る d1.items() for key, value in d1.items(): |
キーと値の入れ替え | - | - | - | d2 = {v: k for k, v in d1.items()} |