ドキュメントから:
反転(seq)
逆を返しますiterator
。seqは、__reversed__()
メソッドを持っているか、シーケンスプロトコル(0から始まる整数引数を持つ__len__()
メソッドと__getitem__()
メソッド)をサポートするオブジェクトでなければなりません。
dict
オブジェクトが実装されていません__reversed__
。後者の方法の両方を実装します。ただし、__getitem__
(0から始まる)整数ではなく、キーを引数として受け取ります。
理由については、これはすでに提案され、ここで説明されています。
編集:
これらの引用は、Python-Devメーリングリストからのものです(スレッド「Add __reversed__ methods for dict」、25。05. 18に開始)。「概念的な」引数から始めます。最初の引数は、Antoine Pitrouによるものです。
OrderedDictがすでにreverse()をサポートしていることには何の価値もありません。議論は両方の方向に進む可能性があります:
dictは最近のOrderedDictに似ているので、reversed()もサポートするはずです。
OrderedDictを使用して、順序付けに関心があることを明示的に通知できます。辞書に何かを追加する必要はありません。
私の考えでは、通常のディクテーションの挿入順序は保証されていないため、概念が定着し、ディクテーションに関する日常の考え方の一部となるにはしばらく時間がかかります。それが発生すると、ユースケースが出現し、ある時点で__reversed__が追加されることはおそらく避けられません。実装は簡単なようであり、順序付けられた有限のコレクションが可逆的であると期待することは、概念的な飛躍ではありません。
レイモンド・ヘッティンガーの返信が続く:
辞書が挿入順序を追跡するようになったことを考えると、最新の挿入(つまり、タスク辞書で最後に追加されたタスクのループ)を知りたいのは理にかなっているようです。その他の考えられる使用例は、Unixのtailコマンドの使用方法に対応している可能性があります。
これらのユースケースが発生した場合、__ reversed__が既にサポートされていることで、popitem()呼び出しとそれに続く再挿入を使用した醜い回避策を実装したくない場合があります。
メーリングリストで表明された主な懸念は、これが少なくとも一部の実装で過度の膨張またはメモリ効率の低下(単一リンクリストではなく二重リンクリストを持たなければならない)であるということでした。):
「注文する」は「リバーシブル」という意味ではありません。たとえば、単一のリンクリストは順序付けされていますが、元に戻すことはできません。
CPython実装は効率的なを提供できますが__reverse__
、追加__reverse__
すると、すべての Python実装がそれを提供することが期待されます。たとえば、一部のPython実装では、ハッシュマップ+単一のリンクリストを使用してdictを実装できる場合があります。__reverse__
が追加された場合、それはもう不可能です。
メーリングリストに戻り、最後の2つのメッセージを示します(どちらも08.06.2018に投稿されています)。最初はMichael Selikからです。
コンセンサスはv3.8に含めるために+1であると私は言っていますか?
スレッドの最後のポイントは、稲田直樹がさまざまな実装を調査し、この機能を3.8に含めてもよいと判断したことです。私が理解しているように、Guidoは、MicroPythonによるv3.7の実装を待つというINADAのアドバイスに同意しました。INADAは気が変わったので、それがすべて賛成だと思いますか?
グイドファンロッサムのメッセージで締めくくる:
それは私には正しいように思えます。次に、これが当てはまる2つのバージョンが作成されます。
他の回答とコメントに記載されているように、reversed()
バージョン3.8(14.10.2018)以降、dictsとdictviewsの両方でサポートされています。
dict
reversed