\r\n\r\n
Pythonのリスト内包を適当に使うことで、リスト操作の反復が容易になります。1行を除けば、より読みやすく、より効率的に実行することができます。
しかし、使い方がわからないと怒られるかもしれません。コードのどこに適用すればいいのかわからないと、さらにもどかしいですよね。ここでは、Pythonのリスト内包の使い方を、実践的な例を交えて紹介します。
Pythonで項目のリストを作成するのは簡単です。しかし、数学や文字列の演算から値や項目のリストを生成する必要がある場合、その作業は少々面倒になることがあります。そこで便利なのが、リスト内包の利用です。
リスト内包を使う利点のひとつは、ひとつのリストで複数の演算を行えることです。
その代わり、新しい項目を作成し、自動的に宣言した空のリストに追加します。そのため、手動で空のリストを作成してforループで追加する代わりに、Pythonのリスト内包を使えば、新しいリストの作成方法を気にすることなく、自動的にこれを行うことができます。
リスト内包」という言葉は、すべての操作が名前付き変数に代入されるPythonのリストにあることに由来しています。前述したように、これによって1行のコードで特定の動作をさせることができます。その出力は新しいリストに追加されます。
最後に、リスト内包の出力を他の目的に利用することもできます。これは、異なる変数に式を積み重ねるからです。だから、後で参照することができるのです。
例えば、BeautifulSoupでWebサイトをスクレイピングすることがあります。例えば、サイトからすべての商品名と価格を取得するつもりだとします。
そして、スクレイピングしたデータをCSVやExcelファイルにまとめることにします。理想は、すべての商品名とその価格をスクレイピングして、別々の列に配置することです。しかし、この場合、リスト内包を使用することで、スクレイピングしたデータを専用の変数に確保することができます。そして、これらの変数を後でPythonのデータフレームに変換することができます。
以下の例をご覧ください。
Products = [i.text for i in bs.find_all('name tags')]
価格 = [i.text for i in bs.find_all('price tags')](i.テキスト for i in bs.find_all('price tags'))とする。
ループ変数が得られたら、PythonのPandaを使って、データフレーム内の別の列に配置することができます。
forループはリスト内包では必須のイテレータです。Pythonのリスト内包は通常、次のような形式を取ります。
ComprehensionVariable = [expression for items in list]
ComprehensionVariableを印刷すると、上記のコードの結果がリストとして出力されます。
ただし、リスト内包とオープンなforループを混同しないように注意してください。
例えば、オープンなForループを使って、1から30までのすべての3の倍数のリストを取得するとします。
myList = []
for i in range(1, 11):
myList.append(i * 3)
print(myList)する。
出力:【3、6、9、12、15、18、21、24、27、30
両者を比較するために、リスト内包を使って同じことをやってみよう。
multiplesOf3 = [i*3 for i in range(1, 11)]
print(multiplesOf3)する。
出力=[3、6、9、12、15、18、21、24、27、30]。
また、条件文のリストを使って、1から10までのすべての奇数を表示する次のコード例を理解することができます。
oddNumbers = [i for i in range(1, 11) if not i%2==2]
print(oddNumbers)する。
出力=[1、3、5、7、9]。
では、上記のコードをオープンなforループで書き換えてみましょう。
myList = []
for i in range(1, 11):
if not i%2 == 0:
myList.append(i)を追加します。
print(myList)する。
出力:[1、3、5、7、9]。
関連:Pythonでリストをアタッチする方法
リスト内包は、ネストしたif文も受け付ける。
oddNumbers = [i for i in range(1, 11) if not i%2==0 if i<4]
print(oddNumbers)する。
出力:[1,3]。
また、ネストされたforループも受け付けます。
someNums = [[i*2 for i in range(1, 3)] for _ in range(4)]
print(someNums)する。
また、リスト内で通常のネストされたforループを持つことも可能です。
someNums = [i*2 for i in range(1, 3) for k in range(4)]
Pythonのリスト内包を使って文字列を操作することもできます。次のような語句の逆包括を見てみましょう。
word = ["This is a python list comprehension tutorial"]
wordCounter = [i.count(' ') + 1 for i in word].
print(wordCounter)
出力:7
リスト内包は、特定の操作を行う関数も受け付けることができます。ここでは、リストの偶数を取得する乗算関数がどのように動作するかを見てみましょう。
Numbers = [4, 7, 8, 15, 17, 10]
def multiplier(n):
倍数=n*2
倍率を返す
multipleEven = [multiplier(i) for i in Numbers if i%2==0](倍率(i) for i in Numbers if i%2==0)。
print(multipleEven)する。
出力:【8、16、20
上記のコードは、内包を使わなくても関数で書くことができます。しかし、リスト内包は、いくつかの反復処理を行い、それを別々の変数に入れる必要がある場合に便利です。
例えば、nに対して別の演算を行い、それに専用の変数を代入することも可能である。
multipleEvenFromOdds = [multiplier(i) for i in Numbers if not i%2==0]
print(multipleEvenFromOdds)する。
出力:【14、30、34】。
Pythonにはリスト内包の他に、辞書内包、集合内包の関数があります。
その仕組みは、次の辞書引きの例をご覧ください。
corresponding = {i: i*2 for i in range(10) if not i%2==0}
print(corr)する
出力:{1:2、3:6、5:10、7:14、9:18}。
上のコードは、1から9までの数字のリストを繰り返し、それらをキーにするものです。そして、Pythonに各キーに2を掛けるように指示します。最後に、この操作の結果を、結果の配列の各キーに対応する値として表示します。
関連:Pythonの配列とリストの仕組み
以下は、リスト内包にやや似た集合内包の例である。
numbers = {i**(2) for i in range(10) if i%4==0}
いんさつ
出力:{0,16,64}。
ただし、リスト理解とは異なり、セットコングレスは重複した項目を削除します。
nums = {i for i in range(20) if i%2==1 for k in range(10) if k%2==1}
print(nums)
出力:{1, 3, 5, 7, 9, 11, 13, 15, 17, 19}。
上記のコードをリスト内包で試してみて、どのような違いがあるのかを確認することができます。
リスト内包の様々な例と、その活用の場について見てきました。しかし、他のPythonの手法と同様に、リスト内包の使用例は、解決したい特定の問題に依存します。したがって、解決したい特定の問題に最適な場合にのみ使用する必要があります。
リスト内包の目的のひとつは、コードを簡素化して読みやすくすることです。そのため、扱う際には複雑さを避けることが重要です。例えば、Pythonの理解は複雑になることがあります。これでは目的が果たせません。