Python列表解析与生成器表达式
Python列表解析
l = ["egg%s" %i for i in range(100) if i > 50] print(l)
l= [1,2,3,4] s = 'hello' l1 = [(num,s1) for num in l for s1 in s] print(l1)
l1 =[] for num in l: for s1 in s: t = (num,s1) l1.append(t) print(l1)
import os g = os.walk('D:\\test') l1 = [for i in g for j in i] file_path =[] for i in g: for j in i[-1]: file_path.append('%s\\%s' % (i[0],j)) print(file_path)
l1 = ['%s\\%s' % (i[0],j) for i in g for j in i[-1]] print(l1)
Python生成器表达式
用列表解析,生成的是列表,但是如果用列表会把整个列表全部读取到内存中,如果列表过大,内存会爆。
生成器表达式是把[]换成(),这就是生成器的形式,每次只读入内存一个值。
l1 = ('egg%s'%i for i in range(10)) print(l1) # 此时是生成器 print(next(l1)) #生成器通过next执行一次
结果:
generator object at 0x000000000282C048
用for进行迭代
for i in l1: print(i)
模拟读取一个大文件:
这是for循环的方式:
l = [] f = open("a") for line in f: line = line.strip() l.append(line) print(l)
列表解析:
l = [line.strip() for line in f] # line.strip()这就是直接 添加到了l列表中 print(l)
用列表的方式占用内存太大:
生成器表达式:
g = (l.append(line.strip()) for line in f ) # 直接换成()就是生成器的方式 for i in g: print(i)
练习 1
sum list中的都是可迭代对象
money_list=[] with open("b.txt") as f: for line in f: # goods = line.strip() goods=line.split() # 对文件的内容进行分割 res = float(goods[-1])*float(goods[-2]) money_list.append(res) print(money_list)
用sum求和的方式
f = open("b.txt") g =(float(line.split()[-1])*float(line.split()[-2]) for line in f) #生成器 print(sum(g)) # sum中的是可迭代对象
练习2
从文件中读取的是字符串,想要进行处理必须是有格式的数据
res = [] with open("b.txt") as f: for line in f: l=line.split() d = {} d["name"] = l[0] d["price"] = l[1] d["count"] = l[2] res.append(d) print(res)
用声明式的编程
文件是迭代器,res此时也是,但是res来自于文件,所以在with中操作,文件关闭后res不能得到,放外面会报错,IO错误
with open("b.txt") as f: # 文件是迭代器 res =(line.split() for line in f) # 此时res是生成器 # print(res) dict=({"name":i[0],"price":i[1],"count":i[2]} for i in res) for j in dict: print(j)
结果:
{'name': 'apple', 'price': '10', 'count': '3'}
{'name': 'tesla', 'price': '1000000', 'count': '1'}
{'name': 'mac', 'price': '3000', 'count': '2'}
{'name': 'lenovo', 'price': '30000', 'count': '3'}
{'name': 'chicken', 'price': '10', 'count': '3'}
对文件中的进行过滤
with open("b.txt") as f: # 文件是迭代器 res =(line.split() for line in f) # 此时res是生成器 # print(res) dict_g=({"name":i[0],"price":i[1],"count":i[2]} for i in res if float(i[1])>10000) print(dict_g) # for i in dict_g: # print(i) print(list(dict_g)) # 这是一种查看的额方式
结果:
{'name': 'tesla', 'price': '1000000', 'count': '1'}
{'name': 'lenovo', 'price': '30000', 'count': '3'}
或者
[{'name': 'tesla', 'price': '1000000', 'count': '1'}, {'name': 'lenovo', 'price': '30000', 'count': '3'}]
- python生成器表达式和列表解析
- Python里有趣的列表解析和生成器表达式
- Python中的列表解析和生成器表达式
- python列表解析和生成器表达式
- 零基础学python-19.8 生成器表达式:当迭代器遇上列表解析
- Python基础:08列表解析与生成器表达式
- python 中的列表解析和生成器表达式
- Python 生成器函数,生成器表达式,迭代器,列表解析
- Python里有趣的列表解析和生成器表达式
- [转]Python里有趣的列表解析和生成器表达式
- 深入理解python的生成器表达式和列表解析
- python生成器表达式和列表解析
- Python 列表解析和生成器表达式
- python--生成器、三元表达式、列表解析、生成器表达式
- 零基础学python-19.8 生成器表达式:当迭代器遇上列表解析
- 零基础学python-19.8 生成器表达式:当迭代器遇上列表解析
- python--迭代器,生成器,三元表达式,列表解析,生成器表达式
- Python列表解析和生成器表达式
- 【python】对列表的过滤, 列表解析,生成器表达式
- python整理十——生成器表达式与列表解析