Python のデフォルトに,list
メソッドがないのはなぜか疑問に思います。メモリ内でリストが順序付けられる方法など、明らかな理由があるのかもしれません。shift
unshift
append
したがって、現在、 を使用してリストの末尾に項目を追加し、末尾から要素を削除できることはわかっています。ただし、リストの連結を使用して、不足しているorメソッドpop
の動作を模倣することしかできません。shift
unshift
>>> a = [1,2,3,4,5]
>>> a = [0] + a # Unshift / Push
>>> a
[0,1,2,3,4,5]
>>> a = a[1:] # Shift / UnPush
>>> a
[1,2,3,4,5]
私は何か見落としてますか?
ベストアンサー1
Pythonのリストは高速な固定長操作に最適化されており、基になるデータ表現のサイズと位置の両方を変更する操作ではO(n)のメモリ移動コストが発生しますpop(0)
。insert(0, v)
実際、CPythonの「リスト」データ型は、他の多くの言語でリストと呼ばれるもの(リンクリストなど)とは動作が異なります。他の言語でリストと呼ばれるものによく似た実装になっています。配列ただし、ここでもいくつか違いがあります。
代わりに興味があるかもしれないcollections.deque
これは、両端に高速な追加とポップを備えたリストのようなコンテナーです。
デキューは、どちらの方向でもほぼ同じ O(1) のパフォーマンスで、デキューのどちら側からでも、スレッドセーフでメモリ効率の良い追加とポップをサポートします。
あなたが尋ねていると思われる欠けているメソッドを、以下の名前で提供します。appendleft
そしてpopleft
:
追加左(バツ)
追加バツデキューの左側に。
ポップレフト()
deque の左側から要素を削除して返します。要素が存在しない場合は、例外が発生します
IndexError
。
もちろんトレードオフもあります。インデックス作成や、真ん中デキューの速度が遅い。実際はdeque.insert(index, object)
不可能だったPython 3.5以前、回転、挿入/ポップ、回転の戻しを行う必要があります。また、deque はスライスをサポートしていないため、同様の機能を実現するには、itertools.islice
代わりに eg を使用して面倒な処理を記述する必要があります。
deque
データlist
構造の長所と短所に関する詳細な議論については、以下を参照してください。Python では deque はどのように実装されていますか? また、deque がリストよりも劣るのはどのような場合ですか?