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列表解析和生成器表达式
列表解析作为动态创建列表的强大工具,值得学习. 列表解析技术之前的状况--函数式编程. lambda.filter(), map() enumerate, sorted, any, all, zip ...
- Python中的列表解析和生成器表达式
Python中的列表解析和生成器表达式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.列表解析案例 #!/usr/bin/env python #_*_coding:utf-8 ...
- Python全栈day18(三元运算,列表解析,生成器表达式)
一,什么是生成器 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己内置的__iter__方法),所以生成器是可迭代对象. 二,生成器分类在python中的表现形式 1 ...
- Python基础(9)三元表达式、列表解析、生成器表达式
一.三元表达式 三元运算,是对简单的条件语句的缩写. # if条件语句 if x > f: print(x) else: print(y) # 条件成立左边,不成立右边 x if x > ...
- python的迭代器、生成器、三元运算、列表解析、生成器表达式
一 迭代的概念 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前 ...
- Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化
一.装饰器 一.装饰器的知识储备 1.可变长参数 :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...
- 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式
一.装饰器 一.装饰器的知识储备 不想修改函数的调用方式,但是还想在原来的函数前后添加功能 1.可变长参数 :*args和**kwargs def index(name,age): print(na ...
- Python基础:08列表解析与生成器表达式
一:列表解析 列表解析(List comprehensions)来自函数式编程语言Haskell .它可以用来动态地创建列表.它在 Python 2.0 中被加入. 列表解析的语法: [exp ...
- Python day14迭代器,三元表达式,列表解析以及生成器表达式
1.迭代器 str=['sds','ccc','dw'] lit_1=str.__iter__()#获取迭代器 print(lit_1.__next__())#打印下一个值 # 用while做for的 ...
随机推荐
- Docker Compose 多容器应用
Docker Compose是一个用来定义并运行复杂应用程序的工具.用Compose,你可以在一个文件中定义多个容器应用程序,然后只需一条命令就可以完成使其运行所需的所有操作. 一个使用Docker容 ...
- Golang : pflag 包简介
笔者在前文中介绍了 Golang 标准库中 flag 包的用法,事实上有一个第三方的命令行参数解析包 pflag 比 flag 包使用的更为广泛.pflag 包的设计目的就是替代标准库中的 flag ...
- IT兄弟连 Java语法教程 Java的发展历程
只有少数几种编程语言对程序设计带来过根本性的影响.其中,Java的影响由于迅速和广泛而格外突出.可以毫不夸张的说,1995年Sun公司发布的Java1.0给计算机程序设计领域带来了一场变革.这场变革迅 ...
- 01.html5+phonegap跨平台移动应用开发
一.html5+PhoneGap基础知识 (1)html5介绍 HTML5是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML 标准版本,现在仍处于发展阶段,但大 ...
- Spring @Import 注解
@Import 导入某个bean 文件 @Configuration @Import({User.class,MyImportSelector.class,MyImportBeanDefinitio ...
- 1.检索数据 ---SQL
相关提示: 结束SQL语句 多条SQL语句必须以分号(:)分隔.多数DBMS不需要在单条SQL语句后加分号,但也有DBMS可能必须在单条SQL语句后加上分号.当然,如果愿意可以总是加上分号.事实上,即 ...
- python所有的魔术方法
据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...
- gedit配置
编辑 \(\rightarrow\) 首选项 \(\rightarrow\) 插件 \(\rightarrow\) 外部工具 启用 进入工具 \(\rightarrow\) Manage Extern ...
- CallContext的LogicalCallContext在多线程环境下面公用变量
压根名听说过这个类的看这里:如何实现对上下文(Context)数据的统一管理 原来以为CallContext就可以直接在多线程环境下面共享使用的,今天突然想到:Asp.Net环境下面,设置来设置去的, ...
- C# 對 List<string> 取交集、補集、超集、串聯
List<string> ls1 =new List<string> { "a", "b", "c", " ...