第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'}