ビギナー
これからPythonっていう言語の勉強を始めようと思うんですけど・・・

先生
うん。

ビギナー
ブログとかを読んでたら、PEP?ってものがよく出てくるんです。

先生
ああ、あるね。

ビギナー
あれなんですか?読んでたほうがいいんですか?

先生
PEPはコーディングの規則や新しくこんな機能つけるよーなんていう情報をまとめた文書だね。

先生
だから読んでおいて損はないと思うよ。

ビギナー
う…でも英語なんですよね。どうにかしてください。

先生
….わかりました。(はぁ)

PEP(Python Enhancement Proposal)はPythonを改良する案、リリーススケジュール、コーディングスタイルなど開発を円滑に進める上で重要なことを文書にまとめておく場所。ここには、Pythonをコーディングするすべての人にとって重要な内容がきっと入っているはず。ビギナーが言うようにもちろん、英語。よって、これをできるだけ毎日、翻訳しながら読み解きまとめていくことで備忘録としていきたいと思います。英語は非常に苦手なので誤訳はご指摘ください。

※以下、アイコンが出てくる箇所は私のコメントになります。それ以外は、翻訳または翻訳のまとめです。

基本情報

Dict Comprehensions

PEP: 274
Title: Dict Comprehensions
辞書型の内包表記
Author: Barry Warsaw <barry at python.org>
Status: Final
Type: Standards Track
Created: 25-Oct-2001
Python-Version: 2.7, 3.0 (originally 2.3)
Post-History: 29-Oct-2001

アブストラクト

PEP202で”リスト内包表記”と呼ばれるPythonの構文拡張を導入しています。このPEPでは”辞書内包表記”呼ばれる同様の構文拡張を提案しています。リスト内包表記と非常によく似た方法で辞書内包表記を使用できますが、リストではなく辞書オブジェクトが生成される点が異なります。

再決議

このPEPはもともとPython2.3に含めるために書かれました。しかし、その利点がdict()コンストラクタと結合されたジェネレータ式によって包含されていることが指摘されたため撤回されました。

しかしながらPython2.7および3.0で、この厳密な機能と密接に関連したセット内包表記が導入されています。2012-04-09に、PEPはStatusをAcceptedに更新し、そしてPython-Versionフィールドを更新することによってこの提案を反映するように変更されました。未解決問題のセクションの問題は現在の実装では解決されているため削除されました。

提案された解決策

辞書内包表記はリスト内包表記とまったく同じですが、角括弧ではなく中括弧を使用して式をグループ化する点が異なります。また、forキーワードの前の左側の部分は、コロンで区切られたキーと値の両方を表します。この表記は、辞書に適用されるリスト内包表記をユーザーに分かりやすくするように設計されています。

根拠

いくつかのデータを連番で配列し、それを辞書に変換したい場合があります。Python2.2では、dict()コンストラクターは、新しい辞書オブジェクトを初期化するための(key, value)ペアとして使用される引数として受け取ります。

しかしながら、あるデータを長さ2の連番に変換するという行為は、メモリまたは性能の観点から不便または非効率的です。また、すばやい重複削除やセットの包含テストのために、オブジェクトのリストをオブジェクトのセットに変換するなど、いくつかの一般的な操作で、コードの明快さを向上させるために構文を改善するべきです。

リスト内包表記と同様に、明示的なforループを常に使用できます(そして実際には、以前のバージョンのPythonでそれを行う唯一の方法でした)。しかし、リスト内包表記と同様に、辞書内包表記は従来のforループよりも構文上簡潔な慣用句を提供できます。

セマンティクス

辞書内包表記のセマンティクスは、Python 2.2の標準的なバージョンで、リスト内包表記を組み込みの辞書コンストラクタに渡すことで証明できます。

意味的には次のものと同等です。

ただし、辞書のコンストラクタによるアプローチには、提案されている構文とは明らかに異なる2つの欠点があります。 第一に、それは口述理解ほど読みやすくない。 次に、プログラマに最初にコア内リストオブジェクトを作成させますが、これはコストがかかる可能性があります。

実装

実装の詳細はすべてPython 2.7と3.0で解決されました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です