[解決済み] ジェネレータ式を表示するには?
質問
Pythonのシェルで、以下のようなリスト内包を入力した場合。
>>> [x for x in string.letters if x in [y for y in "BigMan on campus"]]
きれいに印刷された結果が得られます。
['a', 'c', 'g', 'i', 'm', 'n', 'o', 'p', 's', 'u', 'B', 'M']
辞書の理解も同じ。
>>> {x:x*2 for x in range(1,10)}
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12, 7: 14, 8: 16, 9: 18}
ジェネレータ式を入力すると、あまり親切な応答は得られません。
>>> (x for x in string.letters if x in (y for y in "BigMan on campus"))
<generator object <genexpr> at 0x1004a0be0>
こんなことができるんだ
>>> for i in _: print i,
a c g i m n o p s u B M
それ以外の方法(またはヘルパー関数を書く)で、そのジェネレータオブジェクトをインタラクティブシェルで簡単に評価・印刷することは可能でしょうか?
どのように解決するのですか?
即答です。
実行中
list()
をジェネレータ式で囲むことは、(ほぼ) 正確には
[]
括弧で囲むのと(ほぼ)同じです。そう、あなたは
>>> list((x for x in string.letters if x in (y for y in "BigMan on campus")))
でも、同じように
>>> [x for x in string.letters if x in (y for y in "BigMan on campus")]
はい、これでジェネレータ式がリスト内包に変わります。これに対してlist()を呼び出すのと同じことです。 つまり、ジェネレータ式をリストにする方法は、それを括弧で囲むことです。
詳しい説明です。
ジェネレータ式は、"naked"
for
のような式です。というように。
x*x for x in range(10)
さて、これを単独で1行に貼り付けると、構文エラーになります。しかし、それを括弧で囲むことはできます。
>>> (x*x for x in range(10))
<generator object <genexpr> at 0xb7485464>
これはジェネレータ内包と呼ばれることもありますが、正式名称はジェネレータ式だと思いますので、特に違いはありません。例えば、関数の唯一のパラメータとして渡す場合は、括弧は必要ありません。
>>> sorted(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
基本的に Python 3 と Python 2.7 で利用可能な他のすべての内包は、ジェネレータ式の周りの構文上の糖分に過ぎません。内包を設定します。
>>> {x*x for x in range(10)}
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
>>> set(x*x for x in range(10))
{0, 1, 4, 81, 64, 9, 16, 49, 25, 36}
ディクショナリ。
>>> dict((x, x*x) for x in range(10))
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
>>> {x: x*x for x in range(10)}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
そして、Python3でのリスト内包。
>>> list(x*x for x in range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [x*x for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
Python 2では、リスト内包は単なる構文上の糖分ではありません。しかし、唯一の違いは、Python 2の下ではxが名前空間にリークすることです。
>>> x
9
Python 3 では、以下のようになります。
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
つまり、Pythonでジェネレータ式の内容をきれいに印刷する最良の方法は、リストから内包を作ることなのです! しかし、すでにジェネレータオブジェクトを持っている場合、これは明らかにうまくいきません。そうすると、1つのジェネレータのリストが作成されるだけです。
>>> foo = (x*x for x in range(10))
>>> [foo]
[<generator object <genexpr> at 0xb7559504>]
この場合
list()
:
>>> list(foo)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
これは動作しますが、ちょっとバカです。
>>> [x for x in foo]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
関連
-
opencvとpillowを用いた顔認証システム(デモあり)
-
python call matlab メソッドの詳細
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] リストのリストからフラットなリストを作るには?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] 改行やスペースを入れずに印刷する方法
-
[解決済み] Pythonで標準エラー出力するには?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonの非常に便利な2つのデコレーターを解説
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Python Pillow Image.save jpg画像圧縮問題
-
Pythonの画像ファイル処理用ライブラリ「Pillow」(グラフィックの詳細)
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】LogisticRegression: Pythonでsklearnを使用して、未知のラベルタイプ: '連続'を使用しています。