一、推导式介绍

哇哦!Python 推导式是一种超级酷炫的数据处理方式,它可以让你从一个数据序列构建另一个全新的数据序列的结构体。

Python 支持各种数据结构的推导式

  • 列表(list)推导式:让你像魔术师一样快速创建新的列表,简直就是魔法!

  • 元组(tuple)推导式:让你以一种酷炫的方式创建元组,就像是在编写音乐一样!

  • 字典(dict)推导式:让你以一种神奇的方式创建字典,就像是在施展魔法一样!

  • 集合(set)推导式:让你以一种酷炫的方式创建集合,就像是在搞科学实验一样!

二、列表推导式

1)Python列表推导式,又称列表解析式

2)作用:用一种简(tou)明(lan)扼(zhuang)要(B)的方 法来创建列表

3)格式

  • 格式1:[表达式 for 变量 in iterable(可迭代对象) ]

  • 格式2:[表达式 for 变量 in iterable(可迭代对象) if 条件]

  • 可迭代对象:序列、字符串、元组、列表等

  • 你可以在列表中放入任意类型的对象返回结果将是一个新的列表,在这个以 if 和 fo r语句为上下文的表达式运行完成之后产生.

4)列表推导式的执行顺序:从左到右依次递进,语句之间是嵌套关系。

5)简单模式:只包括循环不包括条件判断

  • 案例1:输出1-9的列表

    list_1 = [x for x in range(1, 10)]
    print(list_1)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]
  • 案例2:加上运算公式

    # 需求1:求列表中元素+1后的值
    list_1 = [x + 1 for x in range(1, 10)]
    print(list_1)  # [2, 3, 4, 5, 6, 7, 8, 9, 10]
    
    # 需求2:求列表中元素乘10后的值
    list_2 = [x * 10 for x in range(1, 10)]
    print(list_2)  # [10, 20, 30, 40, 50, 60, 70, 80, 90]
    
    # 需求3:求列表中元素的平方
    list_3 = [x * x for x in range(1, 10)]
    print(list_3)  # [1, 4, 9, 16, 25, 36, 49, 64, 81]

6)一般模式:包含判断和筛选

  • 案例1:求整数1-9中的偶数

    list_1 = [x for x in range(1, 10) if x % 2 == 0]
    print(list_1)  # [2, 4, 6, 8]
  • 案例2:加上运算公式

    # 需求1:求列表中偶数元素乘10后的值
    list_2 = [x * 10 for x in range(1, 10) if x % 2 == 0]
    print(list_2)  # [20, 40, 60, 80]
    
    # 需求2:求列表中偶数元素的平方
    list_3 = [x * x for x in range(1, 10) if x % 2 == 0]
    print(list_3)  # [4, 16, 36, 64]

7)变态模式:包含循环嵌套和条件筛选

  • 案例1:取出偶数

    list1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    list2 = [x for y in list1 for x in y if x % 2 == 0]
    print(list2)  # [2, 4, 6, 8]

8)遍历字符串

  • 案例1:单遍历取单个字符

    list1 = [x for x in 'python']
    print(list1)  # ['p', 'y', 't', 'h', 'o', 'n']
  • 案例2:双遍历字符相加

    list2 = [x + y for x in 'python' for y in '12']
    print(list2)  # ['p1', 'p2', 'y1', 'y2', 't1', 't2', 'h1', 'h2', 'o1', 'o2', 'n1', 'n2']

三、元组推导式

1)元组推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的元组。

2)格式:

  • 格式1:tuple(表达式 for 变量 in iterable),这里的 iterable 可以是一个范围(如 range),元组,列表,字典或集合等可迭代对象。

  • 格式2:tuple(表达式 for 变量 in iterable if 条件),这里的 iterable 同样可以是上述可迭代对象,而 条件 则是一个筛选条件,只有满足条件的元素才会被包含在生成的元组中。

3)案例:

  • 案例1:推导式前不加tuple,返回的是生成器对象

    tup1 = (x for x in range(0,9))
    print(tup1)  # <generator object <genexpr> at 0x000002776CFC45F0>
  • 案例2:使用 tuple() 函数,可以直接将生成器对象转换成元组

    tup2 = tuple(x for x in range(0, 9))
    print(tup2)  # (0, 1, 2, 3, 4, 5, 6, 7, 8)

四、字典推导式

1)字典推导式和列表推导式的格式是类似的,只不过中括号该改成大括号而已。区别就是字典推导式返回值的类型是字典。

2)格式

  • 格式1:{key: value for value in iterable}

  • 格式2:{key: value for value in iterable if 条件}

其中,key表示字典中的键,value表示字典中的值,iterable是一个可迭代对象,可以是列表、元组、集合等。

在格式1中,字典推导式会遍历iterable中的每个元素,并将每个元素作为值,生成一个键值对,最终返回一个字典。

在格式2中,可以通过添加if语句来筛选出符合条件的元素,并生成相应的键值对。只有满足条件的元素才会被包含在最终的字典中。

需要注意的是,如果iterable中的元素不是唯一的,那么后面的元素会覆盖前面的元素,最终生成的字典中只会包含唯一的键。

以下是一些示例:

  • 示例1:生成一个包含1到5的数字的字典

    {x: x for x in range(1, 6)}

    输出:{1: 1, 2: 2, 3: 3, 4: 4, 5: 5}

  • 示例2:生成一个包含1到5的数字的平方的字典

    {x: x**2 for x in range(1, 6)}

    输出:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

  • 示例3:生成一个包含1到5的数字的平方的字典,但只包含偶数的键值对

    {x: x**2 for x in range(1, 6) if x % 2 == 0}

    输出:{2: 4, 4: 16}

通过字典推导式,可以简洁地生成符合特定条件的字典。

3)案例

  • 案例1:数字为键,数字的平方为值

    dic1 = {x: x ** 2 for x in range(0, 9)}
    print(dic1)  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}
  • 案例2:将列表中各字符串值为键,各字符串的长度为值,组成键值对

    list1 = ['hello', 'python', 'lalala']
    dic1 = {key: len(key) for key in list1}
    print(dic1)  # {'hello': 5, 'python': 6, 'lalala': 6}

五、集合推导式

1)集合是一种无序且不重复的数据结构。

2)在Python中,可以使用以下格式来创建集合:

  • 格式1:{表达式 for 变量 in 可迭代对象}

  • 格式2:{表达式 for 变量 in 可迭代对象 if 条件}

在这两种格式中,表达式表示对变量的操作或计算,变量是可迭代对象中的每个元素,可迭代对象是一个可以遍历的数据类型(如列表、元组、字符串等),条件是一个可选项,用于筛选出满足条件的元素。

使用这种格式创建集合时,会自动去除重复的元素,并且集合中的元素是无序的,即不能通过索引访问。这使得集合在处理需要快速查找和去重的数据时非常有用。

下面是一些示例:

# 格式1示例
numbers = [1, 2, 3, 4, 5]
squared_numbers = {x**2 for x in numbers}
print(squared_numbers)  # 输出:{16, 1, 4, 9, 25}

# 格式2示例
names = ['Alice', 'Bob', 'Charlie', 'David']
long_names = {name for name in names if len(name) > 4}
print(long_names)  # 输出:{'Charlie', 'David'}

希望这些示例能帮助你理解集合的创建方式和用法!

3)案例:结果无重复值,顺序被打乱

set1 = {x for x in 'aaabcdefg123456'}
print(set1)  # {'b', '3', 'g', '2', '1', 'e', 'd', 'c', 'f', 'a', '4', '5', '6'}