ホームページ  >  記事  >  バックエンド開発  >  Python のリスト内包表記を適用する方法

Python のリスト内包表記を適用する方法

WBOY
WBOY転載
2023-05-20 08:10:132005ブラウズ

Python リスト内包表記

リスト内包表記は、Python がリスト (リスト) を作成するためのショートカットです。簡単なコードを使用してリストを作成できます。

1. range( ) 関数

Python の range() 関数は、通常 for ループで使用される整数のリストを作成するために使用できます。

range() 構文: range(start, stop[, step ])

start: カウントは start から始まります。デフォルトは 0 (閉じた間隔) です。例: range(5) は range(0,5) と同等です。

stop:停止の終わりまでカウントしますが、停止 (開始間隔) は含みません。例: range(0,5) は [0, 1, 2, 3, 4] で、5 は含まれません。 step Long、隣接する 2 つの値の差。デフォルトは 1 です。例: range(0,5) は range(0, 5, 1) と同等です。

なぜ range について説明する必要があるのか(リスト内包表記の前), リスト内包表記は反復可能オブジェクトを通じてリストを生成するため、 range() はリスト内包表記で最も一般的に使用される反復可能オブジェクトであると言えます。リスト内包表記の場合、 range() は本質 1 の 1 つです。 range() を使用すると、リスト内包表記の読みやすさと単純さが大幅に低下します。

2. リスト内包表記

リスト内包表記とは、ループの作成 List を指します。非常に幅広いアプリケーション シナリオに使用でき、リストの作成にも使用できます。リストの内包表記は、リストを作成する for ループの簡略版と同等です。

# for循环
list_a = list()
for a in range(5):
    list_a.append(a)
print(list_a)
# 列表推导式
list_b = [b for b in range(5)]
print(list_b)

上記は、を使用してリストを作成するコードです。 for ループとリスト内包表記。list_a と list_b の結果は同じで、どちらも [0, 1, 2, 3, 4] です。

より複雑なリスト内包表記を見てみましょう :

# in后面跟其他可迭代对象,如字符串
list_c = [7 * c for c in "python"]
print(list_c)
 
# 带if条件语句的列表推导式
list_d = [d for d in range(6) if d % 2 != 0]
print(list_d)
 
# 多个for循环
list_e = [(e, f * f) for e in range(3) for f in range(5, 15, 5)]
print(list_e)
 
# 嵌套列表推导式,多个并列条件
list_g = [[x for x in range(g - 3, g)] for g in range(22) if g % 3 == 0 and g != 0]
print(list_g)

実行結果:

['ppppppp', 'yyyyyyy', 'ttttttt', 'hhhhhhh', 'ooooooo', 'nnnnnnn']
[1, 3, 5]
[(0, 25), (0, 100), (1, 25), (1, 100), (2, 25), (2, 100)]
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20]]

コードの説明:

1. リスト内包表記は、次の反復可能オブジェクトを走査し、for の前の式に従って操作を実行し、最終リストを生成します。

2. if 条件文がある場合、for 走査の後に条件判定が行われます。

3. for ループが複数ある場合、最終的なデータ数は複数の for ループの直積になります。 .

4. 入れ子になった for ループの原理と同じ、入れ子になったリストの導出が可能です。

3. コードの読みやすさ

詳しくない方へリスト導出では、for ループを使用して同じ機能を実現できますが、コードは数行必要ですが、リスト導出では 1 行のコードしか必要ありません。

多くの人は、コードは簡潔だと言うでしょうが、実際、リスト内包表記に慣れていると(何回か書くと慣れてきます)、コードの機能は一目で簡単にわかりますが、基本的には読むことができません。 for ループ コードの概要。特にリストを作成する for ループがビジネス ロジックの他の for ループにネストされている場合、最も読みやすいのはまさにリスト内包表記の使用です。

同時に時間、リスト内包表記には、関数と同様に、Python3 ドメイン内で独自のローカルな役割があります。式内の変数と代入はローカルでのみ機能します。式のコンテキスト内で同じ名前の変数も通常どおり参照でき、ローカル変数は影響はありません。

つまり、リスト導出には変数リークの問題は発生せず、リスト導出における代入操作がリスト導出コンテキスト内の同じ名前の変数に影響を与える可能性はほとんどありません。

もちろん、すべてのシナリオでリスト導出の使用が推奨されるわけではありません。たとえば、リスト導出コードが 2 行を超える場合は、for ループへの変更を検討する必要があります。2 行を超えるリスト導出は実際には読み取れません。一般的な原則は、新しいリストの作成にはリスト導出のみを使用し、できるだけ短くすることです。

4. 辞書導出

Python2.7 以降、リストの概念は使用されなくなりました。導出は辞書に移植され、辞書導出が作成されます (セット導出については後ほど説明します)。

リスト導出の概念にすでに慣れている場合は、辞書導出を受け入れるのは難しくありません。コード:

# 因为key是唯一的,所以最后value都是1
dict_a = {key: value for key in 'python' for value in range(2)}
print(dict_a)
 
# 可以根据键来构造值
dict_b = {key: key * key for key in range(6)}
print(dict_b)
 
# 遍历一个有键值关系的可迭代对象
list_phone = [('HUAWEI', '华为'), ('MI', '小米'), ('OPPO', 'OPPO'), ('VIVO', 'VIVO')]
dict_c = {key: value for key, value in list_phone}
print(dict_c)

実行結果:

{'p': 1, 'y': 1, 't': 1, 'h': 1, 'o': 1, 'n': 1}
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
{'HUAWEI': '华为', 'MI': '小米', 'OPPO': 'OPPO', 'VIVO': 'VIVO'}

5. セット導出

Python2.7 では、辞書導出だけでなく、セット導出も可能です。

同様に、コードを直接見てみましょう。このようにして、セットの導出を直観的に見ることができます。

# 遍历一个可迭代对象生成集合
set_a = {value for value in '有人云淡风轻,有人负重前行'}
print(set_a)

実行結果:

{'负', '有', '人', '轻', '前', '云', '重', ',', '淡', '风', '行'}

セットは順序付けされておらず、繰り返しもないので、繰り返しられます。要素は自動的に削除され、実行されるたびに表示されます。順序が異なります。

上記のコードから要約できます:

セットの導出は、リスト導出の [] を置き換えます。辞書導出は 2 つの値の組み合わせを推定することです。これはキーと値のペアのように見えます。

さらに、辞書内包表記か集合内包表記かにかかわらず、これに従うことができます。 if 条件文、ネストされたループなど、リスト内包表記のようなものを使用します。詳細は、独自の使用ニーズに基づいて決定できます。

以上がPython のリスト内包表記を適用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。