列表推导式又称为列表解析
在python中列表用的比较多,用来简化的代码的。所以提供了列表解析这种方式。
循环模式: [(要加工的变量)for 变量 in iterable]
in iterable 是可迭代的例如 range(1,10) list,tuple、字符串这种,如果是一个整数就不行,因为不能迭代。简单来说在python中就是可以用for循环的。python内部来说就是含有 __iter__下划线方法
例子:要将列表中每个数字翻倍并加7,使用循环列表表达式可以这样做
l=[2*n+7 for n in range(1,11)]
print(l)
放集合也可以的,只不过最后输出是列表,那[] 换成{} or() 可以吗?不可以,所以才叫列表推导式
l={2,3,4,5}
l1=[2*n+7 for n in l]
print(l1)
将字符串每个字符变大写
l=[2*n+7 for n in range(1,11)]
print(l)
用到的地方:以某种方式修改现有的列表,比如下面的列表执行后首字母都会变为大写
names=['a1','mei','jo','del']
print(names)
cap_names=[n.capitalize() for n in names]
print(cap_names)
还可以剔除不想要的元素
筛选列表推导式:[加工的变量 for 变量 in iterable if 条件]
例子 返回一个列表中的整数
nums=[-1,0,6,-4,-2,3]
result=[n for n in nums if n>0]
print(result)
使用列表解析删除字符串中的所有元音
eat_vowels='Apple Sauce'
list_ret = [c for c in eat_vowels if c.lower() not in "aeiou"]
#ret返回的结果是一个字符串列表['p', 'p', 'l', ' ', 'S', 'c']
#因此需要join将所有字符串拼接成一个,再返回
str_ret = ''.join(list_ret)
print(str_ret)
join的用法就是str.join(sequence) ,sequence是你要连接的序列,str就是你要选择你要以什么方式将他们连接起来。例子如下
str = "-"
seq = ("a", "b", "c")# 字符串序列
print(str.join(seq))
生成器表达式和列表表达式不同之处在于,把[] 换成()就可以了,例如上面的去掉元音,就是生成器表达式酷似苏生成所需列表或序列部分,但是根据需要生成元素,而不是像列表解析式一次性生成所有元素,就是可以节省空间的意思。
eat_vowels='Apple Sauce'
list_ret = (c for c in eat_vowels if c.lower() not in "aeiou")
print(list_ret)# at 0x0000016D84432340>
str_ret = ''.join(list_ret)
print(str_ret)
生成器表达式也能筛选
# 获取1-100内能被3整除的数
gen=(i for i in range(1,101) if i%3==0)
print(gen) # at 0x0000019CC6422340>
1、列表推导式数据一次性加载到内存,生成器表达式遵循迭代器协议,逐个产生元素
2、列表推导式得到的是一个列表,生成器表达式获取的是一个生成器,是一个内存地址
同时还有字典推导式,集合推导式
l
st1 = ('spring','summer','winter')
lst2 = ('春天','夏天','冬天')
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)
lst = [1,2,3,-1,-3,-7,9]
s = {abs(i) for i in lst}
print(s)