0

for...in ループを実行するためにいくつかの異なる方法を試していました。リストのリストを考えてみましょう:

list_of_lists = []
list = [1, 2, 3, 4, 5]
for i in range(len(list)):
    list_of_lists.append(list) # each entry in l_o_l will now be list

ここで、l_o_l の最初の「列」を別のリストに含めたいとしましょうa。これにはいくつかの方法があります。例えば:

a = [list[0] for list in list_of_lists] # this works (a = [1, 1, 1, 1, 1])

また

a=[]
for list in list_of_lists:
    a.append(hit[0]) #this also works

ただし、2番目の例では、「完全な」展開は次と同等であると想像します

a=[]
a.append(list[0] for list in list_of_lists) #but this, obviously, produces a generator error

実際の「翻訳」は、

a=[]
a.append([list[0] for list in list_of_lists]) #this works

私の質問は、解釈と句読点についてです。なぜ Python は、「list_of_lists のリストの list[0]」展開の周りにリスト ブラケットを追加するかを「知っている」のですか (したがって、すべての書き換えで必要になります)。

4

2 に答える 2

3

ここでの問題は、リスト内包表記とジェネレーター式が単なるループではなく、それ以上のものであるということです。

あなたが示したように、リスト内包表記は反復可能なものからリストを構築する簡単な方法になるように設計されています。

後者の 2 つの例はどちらも機能しません。どちらの場合も、間違ったものをリストに追加しています。最初のケースではジェネレーター、2 番目のケースでは既存のリスト内にリストを追加します。これらはどちらもあなたが望むものではありません。

同時に 2 つの異なる方法で何かを実行しようとしていますが、うまくいきません。リスト内包表記を使用するだけで、最も効率的で読みやすい方法でやりたいことが実行されます。

あなたの主な問題は、リスト内包表記とジェネレーター式を使用しているように見え、それらが何であるか、何をしようとしているのかを理解していないことです。それらを使用する前に、それらをさらに理解しようとすることをお勧めします。

于 2012-05-25T20:08:06.203 に答える
1

私の質問は、解釈と句読点についてです。なぜ Python は、"hit[0] for list in list_of_lists" 展開の前後にリスト ブラケットを追加することを「知っている」/追加するのでしょうか (したがって、すべての書き換えでそれが必要になります)。

それが何を意味するのかわかりません。[i*2 for i in range(0,3)]リスト内包表記に加えて、ジェネレーター式もあることに気付いていないかもしれません(i*2 for i in range(0,3))

ジェネレーター式は、リスト内包表記のように (ただしジェネレーターとして)、マッピングを実行するジェネレーターを作成するための構文です。すべてのリスト内包表記は書き直すことができます。内部がネイキッドである理由は、ジェネレーター式が呼び出しのパラメーターとして表示される場所で、括弧を削除することが許可されているためです。これが に表示されているものです。[c]list(c)clist()a.append(hit[0] for list in list_of_lists)

于 2012-05-25T20:10:29.890 に答える