リストコンプリヘンションとは何ですか?
リスト理解は、既存のシーケンスまたは反復可能なオブジェクトに基づいて新しいリストを作成するためのコンパクトな方法です。ループを使用して複数の行を書く代わりに、同じロジックを1行で表現できます。
基本構文
リストの理解の基本構造は次のとおりです。
новый_список = [выражение 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]リストコンプリヘンションを使用すべきではない場合
エレガントであるにもかかわらず、従来のサイクルが好ましい状況があります。
複雑なロジック: 式が長すぎて読みにくくなった場合
副作用: リストコンプリヘンションは、アクションを実行するためではなく、リストを作成するためのものです
深いネスト: 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チャンネルのフレンドリーなコミュニティ初心者と経験豊富なプログラマーが知識を共有し、タスクを互いに支援し、新しいテクノロジーについて話し合う場所。一緒に学びましょう!
