プログラミングコンテストでは、リストへの要素の追加を連続して行っていくような出題があります。その際、python3では list.insert( i, x ) などを使えば、任意の位置 i へ x を挿入することができます。しかし、この方法では計算量がO(n) であり、指定時間内に問題を解くことが不可能な場合があります。
そこで、リストの先頭もしくは末尾に限ってではありますが、要素の追加または削除を deque を使って O(1)で実行できる方法を紹介します。
(例)配列 mylist = [ ‘a’ ] があったとして、この配列の末尾に 要素 ‘b’ 、先頭に 要素 ‘c’ を追加します。
#(1)
from collections import deque
#(2)
mylist = ['a']
print(mylist)
# --> ['a']
#(3)
d = deque(mylist)
print(d)
# --> deque(['a'])
#(4)
d.append('b')
print(d)
# --> deque(['a', 'b'])
#(5)
d.appendleft('c')
print(d)
# --> deque(['c', 'a', 'b'])
(1)の部分は、deque( ) を使うためのインポート文を記述しています。
(2)の部分は、まだ普通のリストのままです。
(3)の部分で、リストをdequeオブジェクトに変換しています。
(4)の部分が、リストの末尾(=右側)に要素を追加する操作で、d.append(x) で実現しています。
(5)の部分が、リストの先頭(=左側)に要素を追加する操作で、d.appendleft(x) で実現しています。
割と簡単です。ちなにみdequeオブジェクトはほぼ通常の list と同じように扱えます。たとえば要素を連結して出力したい場合は以下のようにすれば良いです。
print(''.join(d))
# --> cab
ただし sort( ) などは使うことができませんので注意が必要です。