Python-理解とジェネレーターの推論(コードを簡素化し、通常のシーケンスを作成または制御するのに適しています)

1.内包表記とジェネレータ内包表記の概要

推导式与生成器推导式概述:推导式(又称解析式),是Python的一种独有特性。
推导式是可以从一个数据序列构建另一个新的数据序列的结构体。
Python中共有三种推导,在Python2和3中都有支持:列表(list)推导式、
字典(dict)推导式、集合(set)推导式。推导式的最大优势是化简代码,
主要适合于创建或控制有规律的序列。

1.1リスト内包

使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表。
列表推导式通常有以下几种常用的语法格式。

1.1.1指定された範囲の値のリストを生成する

语法格式如下:
listName ={expression for var in range}={expression for var in range}

参数说明:
listName : 生成列表的名称。
expression: 表达式,用于计算新列表的元素。
var: 循环遍历。
range: 采用range()函数生成range对象。

例:5つの乱数のリストを生成します。必要な番号の範囲は1〜10(10を含む)です。

import random  # 导入random标准库 ,使用随机函数

rand_num = [random.randint(1, 10) for i in range(5)]
print(rand_num)

演算結果:
ここに画像の説明を挿入


1.1.2リストに基づいて指定された要件のリストを生成する

構文形式は次のとおりです。

newlist = {expression for var in oldlist}

参数说明:
newlist:新生成的列表名称。
expression:表达式,用于计算新列表的元素。
var:变量,值为后面列表的每个元素值。
oldlist:用于生成新列表的原列表。

例:これは価格の異なる一連の製品であり、これらの製品はすべて5%割引する必要があります。

price = [3500, 3800, 5200, 6400, 5000, 4700]
sale = [int(i * 0.95) for i in price]
print("原价格: ", price)
print("新价格: ", sale)

演算結果:
ここに画像の説明を挿入


1.1.3リストから適格な要素を選択して、新しいリストを作成します

構文形式は次のとおりです。

newlist = [exprssion for var in oldlist if condition]

此处if主要起到判断作用,oldlist数据中只有满足if条件的才会被留下,
最后统一生成为一个数据列表。
newlist:新生成的列表名称。
expression:表达式,用于计算新列表的元素。
var:变量,值为后面列表的每个元素值。
oldlist:用于生成新列表的原列表。
condition:条件表达式,用于指定删选条件。

例:これは価格の異なる製品のセットであり、リスト内包表記を使用して5000元未満の価格リストを生成します。

price = [3500, 3800, 5200, 6400, 5000, 4700]
sale = [i for i in price if i < 5000]
print("原价格: ", price)
print("新价格: ", sale)

演算結果:
ここに画像の説明を挿入


1.1.4実装リスト内包の倍数

複数のforのリスト内包は、forループの入れ子関数を実現できます。

示例:求(x,y),其中x是0~5的偶数,y是0~5的技术组成的元组列表。
list_03 = [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
print(list_03)

演算結果:
ここに画像の説明を挿入


1.2辞書の理解

辞書理解のための基本的なテンプレート:

{key:value for key,value in existing_data_structure}
这里和list有所不同,因为dict里面有2个关键的数学key和value。字典推导式
的作用是快速合并列表为字典或提取字典中的目标数据。

1.2.1辞書理解を使用して辞書を作成する

示例:生成字典key是1~5的数字,value是这个数字的2次方
dict_01 = {
    
    i: i ** 2 for i in range(1, 5)}
print(dict_01)

演算結果:
ここに画像の説明を挿入


1.2.22つのリストを1つの辞書に結合する

示例:利用字典推导式合并字典。
list_01 = ['name', 'age', 'gender']
list_02 = ['周天天', 20, '男']
dict_02 = {
    
    list_01[i]: list_02[i] for i in range(len(list_01))}
print(dict_02)

演算結果:
ここに画像の説明を挿入

2つのリストを1つの辞書にマージすることに注意する必要があります

  • 2つのリストのデータ数が同じである場合、len()関数は任意のリストの長さをカウントできます。
  • 2つのリストのデータ数が異なる場合は、データが少ないリストの長さをカウントする必要があります。

1.2.3ディクショナリにターゲットデータを抽出します

示例: 提取计算机价格大于等于2000的字典数据
goods_lists = {
    
    'MAC': 6680, 'HP': 1200, 'DELL': 3400}
new_goods_lists = {
    
    key: value for key, value in goods_lists.items() if value >= 2000}
print(new_goods_lists)

演算結果:
ここに画像の説明を挿入


1.3理解度を設定する

集合推导式跟列表推导式是相似的,唯一的区别就是它使用的是大括号。
集合推导式基础模板: {exprssion for value in collection if condition}

例:名前の重複を排除し、名前の形式を統一して最初の文字を大文字にします。

names = ['Bob', 'JOHN', 'alice', 'bob', 'ALICE', 'James', 'Bob', 'JAMES', 'jAMeS']
new_names = {
    
    n[0].upper() + n[1:].lower() for n in names}
print(new_names)

演算結果:
ここに画像の説明を挿入


1.4タプルのジェネレーターの派生

元组一旦创建,没有任何方法可以修改元组中的元素,
只能使用del命令删除整个元组。

生成器推导式的结果是一个生成器对象,而不是列表,也不是元组。
使用生成器对象的元素时,可以根据需要将其转化为列表或元组。
可以使用_next___()或者内置函数访问生成器对象,
但不管使用何种方法访问其元素,当所有元素访问结束以后,
如果需要重新访问其中的元素,必须重新创建该生成器对象。

生成器对象创建与列表推导式不同的是,生成器推导式是用圆括号创建。

使用元组推导式可以快速生成一个元组,它的表现形式和列表推导式类似,
只是将列表推导式中的中括号修改为小括号。

例:タプル内包表記を使用して、5つの乱数を含むジェネレーターオブジェクトを生成します。

import random

random_num = (random.randint(1, 10) for i in range(5))
print("由随机数生成的元组对象: ", random_num)

演算結果:
ここに画像の説明を挿入

从上面的执行结果可以看出,使用元组推导式生成的结果并不是一个元组或者列表,
而是一个生成器对象,这一点和列表推导式是不同的。要使用该对象生成器,可以将
其转换为元组或者列表。其中,转换为元组需要使用tuple()函数,
而转换为列表则需要使用list()函数。

例:タプル内包表記を使用して、5つの乱数を含むジェネレーターオブジェクトを生成し、それをバイトに変換して出力します。

import random

random_num = (random.randint(1, 10) for i in range(5))
print("由随机数生成的元组对象: ", tuple(random_num))

演算結果:
ここに画像の説明を挿入


おすすめ

転載: blog.csdn.net/I_r_o_n_M_a_n/article/details/115206895