Python入门笔记(九)—— 推导式

昨天腊八不知道大家有没有喝腊八粥

今天来讲 Python的一个独有特性 —— 推导式

推导式是一种能从一个数据序列创建另一个数据序列的语法格式。 这句话所有的关于推导式的博客都说过,但是真的太抽象了。根本无法给人直观的理解,所以我给大家先举个例子。

过滤调长度小于或等于3的元素,返回一个新的列表。

names = ['Bob', 'Tom', 'Alice', 'Jerry', 'Wendy', 'Smith']

new_names = [name for name in names if len(name)>3]   # 此推导式用的[]包裹 所以返回一个列表

print(new_names)

# ['Alice', 'Jerry', 'Wendy', 'Smith']

推导式有三种:列表(list)推导式、字典(dict)推导式、集合(set)推导式

上面的例子正是列表推导式,所以咱们从列表推导式开始讲。

列表推导式

列表推导式的基本格式:

变量名 = [表达式 for 变量 in 列表] 或
变量名 = [表达式 for 变量 in 列表 if 条件]

第二种具体还可以分为两种

[x for x in data if condition]

x只有满足if条件才能被留下来。if起到了过滤器的作用。

a = [x for x in range(100) if x % 2 == 0]
print(a)
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, .....]

[exp1 if condition else exp2 for x in data]

a = [x if x % 2 == 0 else -x for x in range(100)]
print(a)
# [0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15, 16, ......]

data中的x满足了if时将其作为exp1处理,否则按exp2处理。if…else起赋值作用

[name for name in names if len(name)>3]

咱们现在把他拆分一下加深理解
name 列表生成元素的表达式,也可以是一个有返回值的函数。
for name in names 迭代names传入表达式
if len(name)>3 根据条件过滤

执行流程:
遍历出列表中的内容给变量,然后过滤,最后进入表达式。最后统一生成一个列表。

多举几个例子:

  • 将lst中每一个元素进行平方后放入到一个新列表中。

    lst = [1, 2, 3, 4, 5, 6, 7, 8]

    lst = [1, 2, 3, 4, 5, 6, 7, 8]
    a = [x**2 for x in lst]
    print(a)
    # [1, 4, 9, 16, 25, 36, 49, 64]
    
  • 求出列表中是奇数的值,然后放入一个新列表中。

    lst = [1, 2, 3, 4, 5, 6, 7, 8]

    lst = [1, 2, 3, 4, 5, 6, 7, 8]
    a = [x for x in lst if x % 2 != 0]
    print(a)
    # [1, 3, 5, 7]
    
  • 求出列表中所有大于2的偶数进行平方计算

    lst = [1, 2, 3, 4, 5, 6, 7, 8]

    lst = [1, 2, 3, 4, 5, 6, 7, 8]
    a = [x**2 for x in lst if x % 2 == 0]
    print(a)
    # [4, 16, 36, 64]
    
  • 求(x, y), 其中x是0-5之间的偶数, y是0-5之间的奇数组成的元组列表。

    a = [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 != 0]
    print(a)
    # [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
    
  • 求M中3,6,9组成的列表:

    M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

    M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    a = [x[2] for x in M]
    print(a)
    # [3, 6, 9]
    
  • 求M中1,5, 9组成的列表:

    M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

    M = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    a = [M[x][x] for x in range(len(M))]
    print(a)
    # [1, 5, 9]
    

字典推导式

与列表推导式大同小异,具体格式是:

{ key:value for key,value in existing_data_structure }

首先,这个是用{ }包裹的,列表推导式是[ ]。其次因为字典有两个关键的属性,key和value。所以表达式要包含这两个属性。

举个例子:

a = ["A", "B", "C"]
b = ["1", "2", "3"]
c = {k:v for k, v in zip(a,b)}
print(c)
# {'A': '1', 'B': '2', 'C': '3'}

集合推导式

集合推导式和列表推导式也没啥区别,只是[ ] 换成了 { },而且拥有集合的特性—— 去重。

今天三种推导式其实大同小异,也没啥好讲的。主要还是多敲代码多练。

提前祝大家新年快乐,年年有余

谢谢支持,您的支持就是我的动力

你可能感兴趣的:(Python笔记,列表,python)