Effective python 第27条笔记

第27条 用列表推导取代map与filter

写在前言:这篇文章主要是学习effective python的笔记,然后也用了CSDN上一些人的写法,我也附上的连接;effective python是一本好书。

推导:comprehension

可以迭代列表,字典和集合;并根据迭代结果派生出另外一套数据。

语法:

[返回结果的表达式/值(变量)for 变量(此变量应与红字里的变量保持一致) in 可迭代的对象]

lst = []

for i in range(1, 11):

    i = i ** 2 #算平方

    lst.append(i)

    #以上是多写几行的代码

 

square= [ i ** 2 for i in range(1, 11)]#列表推导

print(lst)#这时,lst已经变成[1, 4, 9, 16, 25, 36, 49, 64, 81, 100],后续的alt变量迭代的就是这个list

print(square)

 

#用map实现同样的功能,

alt = list(map(lambda x : x **2 , lst))

print(alt)

 

 

列表的推导的功能都可以用内置函数map实现,map函数能从多个列表中分别取出当前位置上的元素,并且把它们当做参数传给映射函数,这样可以求出新列表的元素值,但是用map函数时,必须把映射逻辑定义成lambda函数

 

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

alt = list(map(lambda x : x **2 ,  filter(lambda x : x % 2 == 0, a)))#用map和filter推导,以及过滤原来的列表;filter过滤出来偶数;

print(alt)

 

列表推导可以实现一样的效果:

compre_h=  [x ** 2 for x in a if (x % 2 == 0)]

print(compre_h)

assert alt == compre_h

运行结果如下:

[4, 16, 36, 64, 100]

[4, 16, 36, 64, 100]

 

 

 

 

输出为2个变量的列表推导:

#任务:

要5以内的单数,和5以内双数组成的所有二元组,然后把这些元组放在一个列表里

语法如下:

[(变量1,变量2) for 变量1 in 可迭代对象1 if 条件1  for 变量2 in 可迭代对象1 if条件2]

以上推导的是嵌套for循环,条件1和条件2需要同时满足。

来自 <Python的列表解析式,集合解析式,字典解析式_LittleHuang950620的博客-CSDN博客_python 字典解析式>

#before comprehension

lst = []

for i in range(1,6):

    if i % 2 == 0:

        continue

    for j in range(1,6):

        if j % 2 == 0:

            lst.append((i,j))

print(lst)

 

# lst2 = [1, 2, 3, 4, 5, 6]

# a = [(x,j) for x in lst2 if (x % 2 == 1) if (j % 2 == 0)]#此代码运行错误,变量j没有创建;

# b = [(x,j) for x in lst2 if (x % 2 == 1) and (j % 2 == 0)]#此代码运行错误,变量j没有创建

# print(a, b)

# assert a == b

 

# after comprehension

lst3 = [1, 2, 3, 4, 5, 6]

c = [(x, j) for x in lst3 if (x % 2 == 1) for j in lst3 if (j % 2 == 0) ]#如果想输出两个变量,应该这么做

#括号其实可以没有,但是为了让我自己更容易理解,我加了括号

print(c)

print(len(c))

 

运行结果如下:

[(1, 2), (1, 4), (3, 2), (3, 4), (5, 2), (5, 4)]

[(1, 2), (1, 4), (3, 2), (3, 4), (5, 2), (5, 4)]

6

字典,集合推导机制;

d = {i:j for i in range(3) for j in 'abc'}#字典推导

print(d)

 

exmp = {}#非字典推导

for i in range(3):

    for j in 'abc':

        exmp[i] = j

print(exmp)

# i 循环一次, j会循环3次,每次执行一次外层循环,里面循环会执行三次;因此遍历取出i元素时, j的元素永远执行三次到了末尾的c

 

#如果需要0对应字符a, 1对应字符b....如下操作

exmp1 = {}

s = "abc"

for i in range(3):

    exmp1[i] = s[i]#利用键的下标 = 字符的下标(取到值),这样键 = 值,插入键值对;

print(exmp1)

运行结果如下:

{0: 'c', 1: 'c', 2: 'c'}

{0: 'c', 1: 'c', 2: 'c'}

{0: 'a', 1: 'b', 2: 'c'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值