{}const=>[]async()letfn</>var
開発Python

Pythonのリスト理解:初心者向けガイド

Pythonのリストコンプリヘンションを学ぶ—エレガントなリスト作成のための強力なツール。基本的な構文から高度なテクニックまで、実用的な例を使用した詳細なガイド。クリーンで効率的なPythonコードの書き方を学びます。

К

Kodik

著者

3分で読める

リストコンプリヘンションとは何ですか?

リスト理解は、既存のシーケンスまたは反復可能なオブジェクトに基づいて新しいリストを作成するためのコンパクトな方法です。ループを使用して複数の行を書く代わりに、同じロジックを1行で表現できます。

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

基本構文

リストの理解の基本構造は次のとおりです。

новый_список = [выражение for элемент in последовательность]

例:従来のアプローチとリスト理解

0から9までの数の正方形のリストを作成しましょう。

従来のアプローチ:

squares = []
for i in range(10):
    squares.append(i ** 2)
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

リストの理解:

squares = [i ** 2 for i in range(10)]
print(squares)
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

結果は同じですが、2番目のオプションは短く、通常の文のように読めます。「0から9までの範囲のiごとに、iの正方形のリストを作成する」。

条件を追加します

最後に条件を追加して、要素を絞り込むことができます。

новый_список = [выражение for элемент in последовательность if условие]

条件付きの例

偶数のみ:

evens = [i for i in range(20) if i % 2 == 0]
print(evens)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

奇数の平方数のみ:

odd_squares = [i ** 2 for i in range(10) if i % 2 != 0]
print(odd_squares)
# [1, 9, 25, 49, 81]

行のフィルタリング:

words = ["apple", "banana", "cherry", "date", "elderberry"]
long_words = [word for word in words if len(word) > 5]
print(long_words)
# ['banana', 'cherry', 'elderberry']

行の操作

リストコンプリヘンションは、文字列の処理に最適です。

大文字に変換:

names = ["anna", "bob", "charlie"]
upper_names = [name.upper() for name in names]
print(upper_names)
# ['ANNA', 'BOB', 'CHARLIE']

最初の文字を抽出します。

words = ["Python", "is", "awesome"]
first_letters = [word[0] for word in words]
print(first_letters)
# ['P', 'i', 'a']

ネストされたループ

リスト理解は、多次元データを操作するためのネストされたループをサポートします。

座標ペアの作成:

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

2つのリストの要素の積:

list1 = [1, 2, 3]
list2 = [10, 20, 30]
products = [x * y for x in list1 for y in list2]
print(products)
# [10, 20, 30, 20, 40, 60, 30, 60, 90]

条件付き演算子 if-else

より複雑なロジックには、三項演算子を使用できます。

новый_список = [выражение_if if условие else выражение_else for элемент in последовательность]

例:偶数を「偶数」に置き換え、奇数はそのままにします。

numbers = [1, 2, 3, 4, 5, 6]
result = ["even" if n % 2 == 0 else n for n in numbers]
print(result)
# [1, '偶数', 3, '偶数', 5, '偶数']

実例

辞書の操作

値の抽出:

prices = {"apple": 50, "banana": 30, "cherry": 80}
expensive = [fruit for fruit, price in prices.items() if price > 40]
print(expensive)
# ['apple', 'cherry']

ファイルの処理

行の読み取りとフィルタリング:

# テキストを含むファイルがあるとします
lines = ["  hello  ", "world", "  Python  ", ""]
cleaned = [line.strip() for line in lines if line.strip()]
print(cleaned)
# ['hello', 'world', 'Python']

数学演算

すべての要素に関数を適用するには:

import math
numbers = [4, 9, 16, 25]
roots = [math.sqrt(n) for n in numbers]
print(roots)
# [2.0, 3.0, 4.0, 5.0]

リストコンプリヘンションを使用すべきではない場合

エレガントであるにもかかわらず、従来のサイクルが好ましい状況があります。

  1. 複雑なロジック: 式が長すぎて読みにくくなった場合

  2. 副作用: リストコンプリヘンションは、アクションを実行するためではなく、リストを作成するためのものです

  3. 深いネスト: 2つ以上のネストされたループはコードを読みにくくする

悪い例(複雑すぎる):

# やめてください!
result = [x * y if x % 2 == 0 else x + y for x in range(10) if x > 5 for y in range(10) if y % 3 == 0]

通常のループを使用して、複数の行に分割することをお勧めします。

その他の理解

Pythonはリストの理解だけでなく、以下もサポートしています。

Dictionary comprehension:

squares_dict = {x: x ** 2 for x in range(5)}
print(squares_dict)
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Set comprehension:

unique_squares = {x ** 2 for x in [1, 2, 2, 3, 3, 4]}
print(unique_squares)
# {1, 4, 9, 16}

ジェネレーター式(メモリを節約するため):

squares_gen = (x ** 2 for x in range(1000000))
# リストではなくジェネレーターを作成し、メモリを節約します

生産性

リストコンプリヘンションは、Pythonインタプリターレベルで最適化されているため、通常、append()を使用した同等のループよりも高速に動作します。

結論

リストコンプリヘンションは、Pythonコードをよりエレガントで読みやすくする強力なツールです。簡単な例から始めて、実際のタスクで練習すると、時間が経つにつれて自然かつ効果的にそれらを使用できるようになります。

覚えておくべき重要なポイント:

  • リストコンプリヘンションはコードを短く、より表現力豊かにします

  • フィルタリングの条件を追加できます

  • ネストされたループをサポート

  • 複雑さを乱用しないでください。読みやすさは簡潔さよりも重要です

  • dict、set comprehensions、generator expressionsもあります

練習し、実験すると、リスト理解はPythonプログラミングスタイルの自然な一部になります!

参加する コディック — 開発者向けのトレーニングアプリケーションです! Telegramチャンネルのフレンドリーなコミュニティ初心者と経験豊富なプログラマーが知識を共有し、タスクを互いに支援し、新しいテクノロジーについて話し合う場所。一緒に学びましょう!

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要