9

次のコードの最後の行は何を意味していますか?

import pickle, urllib                                                                                                                                                     

  handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")
  data = pickle.load(handle)
  handle.close()

  for elt in data:
         print "".join([e[1] * e[0] for e in elt])

問題への私の試み:

  • "".join... join メソッドを使用してテキストを空にします
  • e[1] * e[0] は、シーケンス内の後続の 2 つの値 e を乗算します。
  • e が何かわかりません
  • for ループの前に次のようなものがある場合、それが何を意味するのかわかりません。e[1] * e[0] for e in elt
4

6 に答える 6

20

たぶん、例で最もよく説明されています:

print "".join([e[1] * e[0] for e in elt])

の短縮形です

x = []
for e in elt:
  x.append(e[1] * e[0])
print "".join(x)

リスト内包表記forは、一連のステートメントから式を作成する、単純なループの構文糖衣です。

eltピクルスからロードするため、任意のオブジェクトにすることができますe使用法は、それがシーケンス型であることを示唆していますが、シーケンス プロトコルを実装するものであれば何でもかまいません。

于 2009-02-01T18:34:33.327 に答える
7

まず、URL の前に http:// を付ける必要があります。つまり、次のようになります。

handle = urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")

[e for e in a_list]は、値のリストを生成するリスト内包表記です。

Python 文字列では、*演算子を使用して文字列を繰り返します。コマンドを 1 つずつインタープリターに入力してから、データを確認してください。

>>> data[0]
[(' ', 95)]

これは、データの各行が 2 つの要素を含むタプルであることを示しています。

したがって、式e[1] * e[0]は事実上、e[0]繰り返される文字列e[1]です。

したがって、プログラムはバナーを描画します。

于 2009-02-01T18:34:12.920 に答える
4

[e[1] * e[0] for e in elt]はリスト内包表記であり、別のリスト (この場合は ) をループすることによってリスト自体に評価されeltます。新しいリストの各要素はe[1]*e[0]で、eは の対応する要素ですelt

于 2009-02-01T18:28:03.463 に答える
2

質問自体はすでに完全に回答されていますが、リスト内包表記もフィルタリングをサポートしていることを追加したいと思います。あなたのオリジナルライン

print "".join([e[1] * e[0] for e in elt])

例として、

print "".join([e[1] * e[0] for e in elt if len(e) == 2])

2 つの要素を持つ elt のアイテムのみを操作します。

于 2009-02-03T21:06:38.697 に答える
1

join() は文字列メソッドであり、新しい文字列のセパレーターで機能します

>>> ':'.join(['ab', 'cd'])
>>> 'ab:cd'

そこにはリストの理解は必要ありません。ジェネレーターで十分です

于 2009-02-01T18:33:19.397 に答える
1

Andy'sは素晴らしい答えです!

ループのすべてのステップ (改行あり) を見たい場合は、これを試してください。

for elt in data:
    for e in elt:
        print "e[0] == %s, e[1] == %d, which gives us:  '%s'" % (e[0], e[1], ''.join(e[1] * e[0]))
于 2009-02-01T19:15:46.863 に答える