pythonリストの導出と生成器表現の知識点のまとめ


まずコードを見てみます。

chars = "abcd"
tmp = []
for char in chars:
 tmp.append(ord(char))
print(tmp)
これは一般的な書き方です。文字列の各文字をASCIIコードと言います。そしてtmp配列に保存します。
リストを使って導き出す方式:

tmp = [ord(char) for char in chars]
出力:[97,98,99,100]
リストガイドにはifとelseも使用できます。
ifが一つしかない時:

chars = "abcd"
tmp = [ord(char) for char in chars if ord(char)>=98]
print(tmp)
出力:['b','c','d']
加えて、もちろんfilterとmapを利用しても同じ効果があります。

tmp = list(filter(lambda x:x>=98,map(ord,chars)))
この文の意味は、mapを使ってcharsの各文字をord関数で処理するということです。filterを使用して、この各文字のASCIIコードをフィルタリングすると98以上になります。最後にこれらの該当条件の値をリストに保存します。lambada x:x>98は匿名関数である。
if elseがある場合:

chars = "abcd"
tmp = [True if ord(char)>=98 else False for char in chars]
print(tmp)
出力:[False、True、True、True]
一般的に、リストガイドはできるだけ短いままにします。
次の例を見てください。リストを利用して、デカルト積を計算します。(服の色とサイズを例にします。)

colors = ["black","white"]
sizes = ["S","M","L"]
tshirts = [(color,size) for color in colors for size in sizes]
print(tshirts)
生成器式は、他のデータタイプのシーケンスを生成するために使用できます。リスト導出は、元の祖先、配列、および他のタイプを初期化することもできますが、生成器式はより良い選択です。これは、ジェネレータ表式が、ローズマリープロトコルに従って、まず完全なリストを作成する代わりに、要素を一つずつ生成することができるからです。
ジェネレータ表現の文法とリストは同じですが、大かっこを丸かっこにします。
生成器式でタプルと配列例を生成します。

chars = "abcd"
tmp = tuple(ord(char) for char in chars)
print(tmp)
出力:(97,98,99,100)

import array
chars = "abcd"
a = array.array("I",(ord(char) for char in chars))
print(a)
出力:array('I',[97,98,99,100]
arrayの構造方法は、2つのパラメータを提供する必要があります。最初は配列中の要素の記憶方法です。ジェネレータ表式が唯一のパラメータであれば、括弧で囲まないでください。ここでは唯一ではないので、括弧で囲まれます。

colors = ["black","white"]
sizes = ["S","M","L"]
for tshirt in ("%s %s" % (c,s) for c in colors for s in sizes):
  print(tshirt)
出力:
black
ブラック
black
white S
white M
white L
以上が今回紹介したすべての関連知識点です。勉強とサポートに感謝します。