python 字典、列表、元组生成器的使用
python的生成式在一些类型相互转换的时候可以写出十分优雅的代码。如列表转换成另一个列表、字典、或元组。并且代码的执行效率也比使用for...in...循环高。
列表生成式
列表生成式即生成列表的生成式,写法简单而优雅,可以将多行代码融合成一行。主要的作用是将其他对象转换成列表或对原来的列表进行过滤。
# 列表转换列表 ls = [1,2,4,6] ls1 = [x**2 for x in ls] print(ls1) 结果:[1,4,16,36] # 对列表过滤,返回true的才会保留到列表 ls = [1,2,4,6] ls1 = [x**2 for x in ls if x > 3] print(ls1) 结果:[16, 36] # 多条件过滤 ls = [1,2,4,6] ls1 = [x**2 if x > 2 else x**3 for x in ls] print(ls1) 结果:[1, 8, 16, 36] # 多重循环 ls = [1,2,4,6] ls1 = [x**y if x > 2 else x**3 for x in ls for y in ls] print(ls1) 结果:[1, 1, 1, 1, 8, 8, 8, 8, 4, 16, 256, 4096, 6, 36, 1296, 46656]
生成器生成式
- 在涉及到需要遍历列表而不是针对列表的某个值操作时,使用生成器代替列表可以减少内存的消耗。
ls = [1,2,4,6] ls1 = (x**2 for x in ls) print(ls1) 结果:<generator object <genexpr> at 0x0000021B21DED150> # 通过for..in取数据不需要处理StopIteration for i in ls1: pass # next()方法需要处理StopIteration while True: try: print(next(ls1)) except StopIteration: pass
字典生成式
字典生成式在一些需要列表或元组转化成字典的场合可以写出很优雅的代码。
# dict()可以接受类似列表生成式的写法,前提是ls至少是二维可迭代对象,否则报错 ls = [('name1','xiao'),('name2','wang')] dict_ls = dict(x for x in ls) print(dict_ls) 结果:{'name1': 'xiao', 'name2': 'wang'}
元组生成式
由于()这个类似列表生成式的形式被生成器占用了,所有元组生成式使用tuple()来进行。
ls = [('name1',['1','2']),('name2','wang')] dict_ls = tuple(x for x in ls) print(dict_ls) 结果:(('name1', ['1', '2']), ('name2', 'wang'))