インターネットで以下のコードを見つけて、それを理解しようとしています。
ループの後半で値が割り当てられたときに、どのように値を i に使用できるかわかりません。
さらに、誰かがそれがどのように機能するかを説明できるかどうか、つまり、反復ごとに割り当てられるかどうかも高く評価します
>>> import pprint
>>> ds = dict((chr(i), range(i, i+5)) for i in range(65,70))
インターネットで以下のコードを見つけて、それを理解しようとしています。
ループの後半で値が割り当てられたときに、どのように値を i に使用できるかわかりません。
さらに、誰かがそれがどのように機能するかを説明できるかどうか、つまり、反復ごとに割り当てられるかどうかも高く評価します
>>> import pprint
>>> ds = dict((chr(i), range(i, i+5)) for i in range(65,70))
ジェネレータ式を見ています。前の部分for
は、式で定義されたループで実行されfor
ます。
ジェネレーター式は一連のkey, value
ペアを生成し、dict()
コンストラクターはそれを使用して辞書を作成します。このコードは、次と同じ結果になると読むことができます。
ds = {}
for i in range(65, 70):
ds[chr(i)], range(i, i+5)
Python 2.7 と Python 3 では、辞書内包表記も使用できます。
ds = {chr(i): range(i, i+5) for i in range(65,70)}
結果は同じです。式を定義key: value
して、ループからディクショナリを構築します。
ジェネレーター式、および (リスト、辞書、またはセット) 内包表記では、複数のネストされたループを使用し、if
ステートメントを追加してデータをフィルター処理できます。これらはネスト順に定義されます。最初に最も外側のループ:
result = [i ** 2 for foo in range(10) if foo % 2 == 0 for i in range(foo)]
次のように読むことができます:
result = []
for foo in range(10):
if foo % 2 == 0:
for i in range(foo):
result.append(i ** 2)
簡単な紹介については、この記事を参照してください。
ジェネレーター式を使用してタプルの反復子を作成し、それをdict
コンストラクターに渡して新しい辞書を作成します。リストに変換してジェネレーターが何をしているかを調べると役立ちます。
>>> list((chr(i), range(i, i+5)) for i in range(65,70))
[('A', [65, 66, 67, 68, 69]), ('B', [66, 67, 68, 69, 70]), ('C', [67, 68, 69, 70, 71]), ('D', [68, 69, 70, 71, 72]), ('E', [69, 70, 71, 72, 73])]
タプルのリストを渡す場合dict
、各タプルの最初の要素がキーとして使用され、2 番目の要素が値として使用されることに注意してください。
>>> dict([('key1', 'val1'), ('key2', 'val2')])
{'key2': 'val2', 'key1': 'val1'}