リスト、辞書、セット
シャローコピー
Pythonクックブック第2版の「オブジェクトのコピー」のまとめ。
- リストL
- list(L)
- copy.copy(L)
- [x for x in L]
- L[:]
- L + []
- L * 1
- 辞書d
- dict(d)
- copy.copy(d)
- d.copy()
- d1={}; d1.update(d)
- dict(d.items())
- dict(d.iteritems())
- セットs
- set(s)
- copy.copy(s)
- s.copy()
- s1=set(); s1.update(s)
- {x for x in s} (Python 3.0)
オブジェクトの相互変換
3つの各オブジェクトは全てiterableで、for文のinの後やsorted()の第一引数などiterableを要求する場所にオブジェクトをそのまま置ける。また、相互変換は基本的に各コンストラクタで行えば良いが、リストから辞書は、dict(enumerate(L))で行える。つまり、変換してあげれば基本的に3つのオブジェクトの全てのメソッドを呼び出せることになる。例えば、以下のことが可能。
- リストの引き算
- L1 = [4, 3, 2, 1]、L2 = [2, 3] ⇒ list(set(L1) - set(L2)) # [1, 4]
- 順番気にするなら、sorted(list(set(L1) - set(L2)), key=L1.index) # [4, 1]
- L1 = [4, 3, 2, 1]、L2 = [2, 3] ⇒ list(set(L1) - set(L2)) # [1, 4]
- リストの範囲外の要素のアクセス
- L = [1, 2, 3, 4] ⇒ dict(enumerate(L)).get(4) # None
- リストの各要素の第2要素のリストの取り出し
- L = [(1, 'a'), (2, 'b'), (3, 'c')] ⇒ dict(L).values() # ['a', 'b', 'c']
- もちろん、[x[1] for x in L]の方が簡単
- L = [(1, 'a'), (2, 'b'), (3, 'c')] ⇒ dict(L).values() # ['a', 'b', 'c']
- リストの重複要素の削除
- L = [4, 3, 6, 4, 2, 8, 1, 3, 1] ⇒ sorted(set(L), key=L.index) # [4, 3, 6, 2, 8, 1]