メインコンテンツにスキップ
モジュール 6 · レッスン 1 / 4コース内の 21/36~12 min
モジュールのレッスン (1/4)

リスト内包表記

リスト内包表記 は、次の条件を適用してリストを構築する式です。 反復可能への変換 (およびオプションでフィルター)。それは for + append を 1 行で記述する Python の方法。

Python
# stile imperativo (verboso)
quadrati = []
for n in range(5):
    quadrati.append(n * n)

# stile pythonico
quadrati = [n * n for n in range(5)]
# [0, 1, 4, 9, 16]

完全な構文

Python
[espressione for elemento in iterabile if condizione]
  • 式: 結果のリストに何を入れるか
  • 反復可能な要素の場合: ソース ループ
  • if 条件 (オプション): 一致する要素のみを保持します。
Python
pari = [n for n in range(10) if n % 2 == 0]
# [0, 2, 4, 6, 8]

maiuscole = [p.upper() for p in ["ciao", "mondo"]]
# ['CIAO', 'MONDO']

lunghe = [p for p in ["a", "bb", "ccc", "dddd"] if len(p) >= 3]
# ['ccc', 'dddd']

式内の if/else (3 項)

(フィルターではなく) 条件付きで 変換するには、三項関数を使用します for の前の式:

Python
[n if n > 0 else 0 for n in [-2, -1, 0, 1, 2]]
# [0, 0, 0, 1, 2]

複数の場合: デカルト積

複数の for 句をネストできます。

Python
coppie = [(x, y) for x in range(3) for y in range(2)]
# [(0,0), (0,1), (1,0), (1,1), (2,0), (2,1)]

for 句の順序は、あたかも「外側 - 前 - 内側」です。 ネストされたループ。

内包表記を使用しない場合

  • 多くのネストされた if/else 分岐を含む複雑なロジック → 明示的なループを使用します。
  • 副作用 (印刷、ファイル書き込み) → 理解ではなくループ。
  • 2 つ以上のネストされたレベル → ほとんどの場合、明示的な名前付きループの方が優れています。

入れ子になったリストの内包表記

単一のリスト内包表記内で複数の for ループをチェーンできます。たとえば、行列 (リストのリスト) を単一のフラット リストにフラット化するには、次のように記述できます。

Python
matrix = [[1, 2], [3, 4]]
flat = [item for row in matrix for item in row]
# result: [1, 2, 3, 4]

ループの順序は、従来の for ループのネスト順序を正確に反映しています。

試してみてください

運動#python.m6.l1.e1
試行回数: 0読み込み中…

`nums = [1, 2, 3, 4, 5, 6]` とすると、偶数のみの 2 乗で `even_squares` を構築します。 `even_squares` を評価します。

エディターを読み込み中…
ヒントを表示

最後に n % 2 == 0 の場合。

3 回の試行後に解決策が利用可能になります

復習演習

運動#python.m6.l1.e2
試行回数: 0読み込み中…

`words = ['Ciao', 'Mondo', 'Python', 'Java']` とすると、すべての単語の長さで `lengths` を構築し、5 文字未満の単語のみで `short_words` を構築します。 `(lengths, short_words)` を評価します。

エディターを読み込み中…
ヒントを表示

2 つの別々の内包。

3 回の試行後に解決策が利用可能になります

追加の課題

運動#python.m6.l1.e3
試行回数: 0読み込み中…

Use a list comprehension to calculate the squares of only the even integers between 1 and 10 inclusive. Store the list in `even_squares` and evaluate it.

エディターを読み込み中…
ヒントを表示

反復には range(1, 11) を使用し、フィルターには x % 2 == 0 を使用し、式として x**2 を使用します。

3 回の試行後に解決策が利用可能になります