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的 ...
随机推荐
- 教妹学 Java:晦涩难懂的泛型
00.故事的起源 “二哥,要不我上大学的时候也学习编程吧?”有一天,三妹突发奇想地问我. “你确定要做一名程序媛吗?” “我觉得女生做程序员,有着天大的优势,尤其是我这种长相甜美的.”三妹开始认真了起 ...
- QMYSQL driver not loaded 的原理和解决办法
转:http://blog.csdn.net/m15814478834/article/details/49902077 最近使用Qt遇到了"QMYSQL driver not loaded ...
- solidity 学习笔记(4)library库
library库的申明: library SafeMath{ functrion mul(uint a,uint b) public returns (uint){ uint c= a*b; asse ...
- python之格式化字符串( format )
用法: 它通过 { } 和 : 来代替传统 % 方式 1.使用位置参数 要点:从以下例子可以看出位置参数不受顺序约束,且可以为 { }, 只要 format 里有相对应的参数值即可,参数索引从0开,传 ...
- BOM核心API
前言 我觉得前端中最难的不是业务逻辑,而是API太多,知道的太少. BOM是什么? BOM是Browser Object Model的缩写,即浏览器对象模型.浏览器对象模型提供了可以与浏览器窗口进行互 ...
- RobotFramework学习笔记-Web自动化
一.窗口关键字使用 1.当前浏览器弹出新的窗口 使用Select Window和Close Window处理弹出窗口.实际使用中Select Window不一定会一次选中,通常会结合Wait Unti ...
- 黑马学习SpringMVC 基本开发步骤
- Photoshop CC 2014 for mac破解版
https://pan.baidu.com/s/1gfmTq8b 安装PS试用版后,打开Applications/Photoshop CC 2014文件夹下, 右键Photoshop CC 201 ...
- CC08:翻转子串
题目 假定我们都知道非常高效的算法来检查一个单词是否为其他字符串的子串.请将这个算法编写成一个函数,给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成,要求只能调用一次检查子串的函数. 给 ...
- CodeForces - 500A-New Year Transportation(模拟)
New Year is coming in Line World! In this world, there are n cells numbered by integers from 1 to n, ...