-2

単純な dict が作成されます。

 procinfos = {"f1": f1, "f2": f2, "f3shell" : (wrap_for_process, q, f3shell, "input arg1", "input arg2")}

次に、その内容を印刷します。

 print (procinfo for procinfo in procinfos)

<generator object <genexpr> at 0x7f46dccc0dc0>

なぜpythonはこれがジェネレーターだと教えてくれるのですか? 内容を簡単に印刷するにはどうすればよいですか。ジェネレーターについて読んだことから、それらは辞書/リストを消費しないことを意図しています。しかし、これはすでに完全に具体化されたコレクションです。(少なくとも私には..)単純に印刷しないことは意味がありません。これは一般的な使用例です。これらのコレクションの基本的な出力を取得する簡潔な方法をいただければ幸いです。ありがとう。

更新:これを複数行ではなく、単一行/インラインで行います。ありがとう。

4

4 に答える 4

5

ジェネレーターを印刷しています。

procinfo for procinfo in procinfos

ジェネレータ式です。反復されたときにのみ評価されます。たとえば、リストコンストラクターに渡すことで、それを行うことができます。

list(procinfo for procinfo in procinfos)

ただし、(注 1) を使用しても同じ結果が得られます。

list(procinfos.keys())

または、Python 2 では次のようにします。

procinfos.keys()

したがって、ほとんどの場合、自分ができることを実行してください。

print procinfos.keys()

各行に 1 つずつ印刷する場合は、次のようにします。

print '\n'.join(procinfos)

注 1: 実際にlist(procinfos)は '\n'.join(procinfos) と同じように機能しますが、なぜ機能するのかはそれほど明白ではありませんが、辞書を反復処理するとそのキーを反復処理するためです。これは少し高度な Python であるため、今は心配する必要はありません。:-)

于 2013-05-14T22:37:25.640 に答える
2

にジェネレータ式を渡したからprintです。print文字列以外の引数を文字列に変換しようとしますが、ジェネレーターには、(イテレーターによって) 使用されるまで評価されないため、 strまたはrepr<generator object...>の人間が判読できる適切な定義がありません。そのため、結果が得られます。必要なもの:

for procinfo in procinfos:
    print(procinfo)

インライン ソリューションの場合、探しているフォーマットによって異なりますが、次のようなものを使用します。

print('\n'.join(procinfos))

もちろん、これ (および元のコード)はからのキーのみを出力しますprocinfos。キーと値のペアが必要な場合は、次のようにすることができます。

print('\n'.join('{}: {}'.format(k, v) for k, v in procinfos.items()))

もちろん、そこに改行またはその他の書式設定が必要であると想定しています。これは、辞書全体を 1 行に出力するだけで十分だからprint procinfosです。

于 2013-05-14T22:33:59.823 に答える
2

Just use brackets instead:

print [procinfo for procinfo in procinfos]
于 2013-05-14T22:36:47.643 に答える
0

他の回答が言うようにprint、ジェネレーター式を明示的に指定すると、ジェネレーターが出力されます。

リストを出力したい場合は、(a) リストからリストを作成するか、(b) 最初にリストを渡す必要があります (たとえば、ジェネレーター式の代わりにリスト内包表記を使用します)。

print list(procinfo for procinfo in procinfos)
print [procinfo for procinfo in procinfos]

Lennart Regebro が指摘しているように、辞書のキーを出力したいだけなら、genexp や listcomp さえ必要ありません。なぜなら、このkeysメソッドはリスト (Python 2 の場合) または渡すことができる反復子list(Python の場合) を返すからです。 3):

print procinfos.keys()

または、さらに言えば (2.x と 3.x の両方):

print list(procinfos)

そして、おそらくキーと値の両方を意味する辞書の「内容を印刷」したい場合は、辞書を印刷するだけです:

print procinfos

printただし、これを解決する最善の方法は、魔法に頼らず、__str__十分に優れたフォーマットを使用することです。代わりに、出力を文字列に変換する方法を決定し、それを実行します例えば:

print ' '.join(procinfo for procinfo in procinfos)

しかしもちろん、上記のすべての点はここでも当てはまります。

print ' '.join(procinfo)
print ' '.join(procinfo.items())
# ...
于 2013-05-14T22:43:26.627 に答える