博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python列表解析与生成器表达式
阅读量:4322 次
发布时间:2019-06-06

本文共 2680 字,大约阅读时间需要 8 分钟。

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

转载于:https://www.cnblogs.com/Python666/p/6726809.html

你可能感兴趣的文章
@ServletComponentScan ,@ComponentScan,@Configuration 解析
查看>>
unity3d 射弹基础案例代码分析
查看>>
thinksns 分页数据
查看>>
os模块
查看>>
LINQ to SQL vs. NHibernate
查看>>
基于Angular5和WebAPI的增删改查(一)
查看>>
windows 10 & Office 2016 安装
查看>>
最短路径(SP)问题相关算法与模板
查看>>
js算法之最常用的排序
查看>>
Python——交互式图形编程
查看>>
经典排序——希尔排序
查看>>
团队编程项目作业2-团队编程项目代码设计规范
查看>>
英特尔公司将停止910GL、915GL和915PL芯片组的生产
查看>>
Maven配置
查看>>
HttpServletRequest /HttpServletResponse
查看>>
SAM4E单片机之旅——24、使用DSP库求向量数量积
查看>>
从远程库克隆库
查看>>
codeforces Unusual Product
查看>>
hdu4348 - To the moon 可持久化线段树 区间修改 离线处理
查看>>
正则表达式的搜索和替换
查看>>