Python のリストに shift/unshift メソッドがないのはなぜですか? 質問する

Python のリストに shift/unshift メソッドがないのはなぜですか? 質問する

Python のデフォルトに,listメソッドがないのはなぜか疑問に思います。メモリ内でリストが順序付けられる方法など、明らかな理由があるのか​​もしれません。shiftunshift

appendしたがって、現在、 を使用してリストの末尾に項目を追加し、末尾から要素を削除できることはわかっています。ただし、リストの連結を使用して、不足しているorメソッドpopの動作を模倣することしかできません。shiftunshift

>>> 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 がリストよりも劣るのはどのような場合ですか?

おすすめ記事