教えてください、それはどのように正確に機能しますか?各反復結果が配列に書き込まれるのはなぜですか?
list_of_strings = [a.rstrip('\n') for a in list_of_strings]
このリスト内包表記:
list_of_strings = [a.rstrip('\n') for a in list_of_strings]
このより一般的なコードと同等です:
temp_list=[]
for a in list_of_strings:
temp_list.append(a.rstrip('\n'))
list_of_strings=temp_list
ほとんどの場合、リスト内包はより速く、読みやすくなります。自明でないPythonを書きたい場合は、それを学び、それを使用してください。
これは、(変数に格納されている)文字列のリストをlist_of_strings
取得し、それを繰り返して、各文字列を一時的に変数に割り当て、各文字列から文字をa
取り除き\n
ます。結果は、同じ変数に割り当てられた文字列のリストです。
これはリスト内包表記を使用しています。一般に、append()を含むほとんどのforループとリスト操作は、同等のリスト内包表記に変換できます。これを示す簡単な例を次に示します。
new_list = []
for i in range(10):
new_list.append(i**2)
単純に次のように書き直すことができます
new_list = [i**2 for i in range(10)]
リスト内包表記を取得しfor
、理解度をテストするために-loopで書き直すと、有益な場合があります(どちらも同じ結果が得られるはずです)。
ほとんどの場合、リスト内包は同等のループよりも高速でありfor
、アルゴリズムを表現するためのよりコンパクトな方法であることは明らかです。ネストされたリスト内包表記も使用できますが(ネストされたループを持つことができるのと同じようにfor
)、すぐに理解しにくくなる可能性があります:)
また、上記のコードには示されていませんが、リスト内包表記の値をフィルタリングできます。つまり、値がいくつかの基準を満たしているかどうかに応じて、結果のリストに値を含める(または含めない)ことができます。
余談ですが、Pythonは同様の集合内包表記とジェネレータ式も提供します。これらすべてについて学ぶ価値は十分にあります。
Pythonのリスト内包表記の構文をよりよく理解するには、Pythonのリスト内包表記の概要をお読みください。
各反復結果はリストに書き込まれません。代わりに、まったく新しいリストが右側に作成され、=記号の左側にある変数list_of_stringsに割り当てられます。
リスト内包表記には、次の一般的な形式があります
result = [ x for x in list]
このリスト内包表記に相当する手順コードは次のとおりです。
for x in list:
x
有用なリスト内包表記を作成する次のステップは、角かっこの後の最初のxに関数を呼び出すか適用することです。
result = [function(x) for x in list]
result = [x.function(arg) for x in list]
list_of_strings = [a.rstrip('\n') for a in list_of_strings]
result = [x*2 for x in list_of_numbers]
このリスト内包表記に相当する手順コードは次のとおりです。
for x in list:
function(x)
また
for x in list:
x.function()
リスト内包表記にさらに力を加えるために、次のような条件を追加できます。
result = [function(x) for x in list if x == True]
list_of_strings = [a.rstrip('\n') for a in list_of_strings if '\n' in a]
result = [x*2 for x in [1,2,3,4,5,6,7] if x > 3]
リスト内包表記は、関数のような優れたフィルターを作成し、多くの場合、cpythonのmapやfilterのようなハードcコード化されたプリミティブと同じくらい高速です。
これは、リスト内包表記と呼ばれるPythonの機能です。基本的に、括弧内に書き込むのは、「このループを実行してから、結果のリストを作成する」の省略形です。