您的位置:首页 > 编程语言 > Python开发

Python列表解析与生成器表达式

2017-04-18 11:15 591 查看

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: