リスト、辞書、セット

シャローコピー

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]
  • リストの範囲外の要素のアクセス
    • 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 = [4, 3, 6, 4, 2, 8, 1, 3, 1] ⇒ sorted(set(L), key=L.index) # [4, 3, 6, 2, 8, 1]