Pythonのlist, dictの操作で便利だけど意外に忘れられがちなイディオムをまとめた。
listの連結
2つのリストを連結してひとつにする。
lst1 = [1, 2, 3]
lst2 = [4, 5, 6]
lst3 = lst1 + lst2
print(lst3)
#
# [1, 2, 3, 4, 5, 6]
#
listの反転
Python3ではreversed
を使うとイテレータが返ってくるので、list(reversed(lst))
みたいにlist()
で具現化しないといけなくて面倒。
sliceを使って書くのがスマート。
lst1 = [1, 2, 3, 4]
lst2 = lst1[::-1]
print(lst2)
#
# [4, 3, 2, 1]
#
2重listの転置
2重リストの行と列を入れ替える操作は1行で書ける。
lst = [[1, 2, 3], [4, 5, 6]]
lst = list(map(list, zip(*lst)))
print(lst)
#
# [[1, 4], [2, 5], [3, 6]]
#
一見複雑そうに見えるが、2段階に分けて考えると意外に単純。
zip(**lst)
=> [(1, 4), (2, 5), (3, 6)]
list(map(list, zip(*lst)))
=> [[1, 4], [2, 5], [3, 6]]
一番外側のlist()
はPython3でmap()
の返り値でイテレータが返ってくるので具現化するためのもの。
Python2では map(list, zip(*lst))
で良い。
dictのkey/valueを入れ替える
key->valueをvalue->keyに入れ替えるのは内包表記で書くのも良いが、個人的に一番簡潔だと思うのは以下のやり方。
d = {'a': 1, 'b': 2, 'c': 3}
d_inv = dict(zip(d.values(), d.keys()))
print(d_inv)
#
# {1: 'a', 2: 'b', 3: 'c'}
#
dictの合成
2つのdictを合成して新しい1つのdictを作る。
ただし、Python2だとこの書き方はできず、Syntax Error
になる。
3つ以上のdictの場合でも合成可能。
d1 = {'a': 1, 'b': 2}
d2 = {'c': 3, 'd': 4}
d3 = {**d1, **d2}
print(d3)
#
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
#
d1
に破壊的操作を加えても良い場合は次の書き方もできる。
d1.update(d2)
print(d1)
#
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
#