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列表解析与生成器表达式的更多相关文章

  1. python列表解析和生成器表达式

    列表解析作为动态创建列表的强大工具,值得学习. 列表解析技术之前的状况--函数式编程. lambda.filter(), map() enumerate, sorted, any, all, zip ...

  2. Python中的列表解析和生成器表达式

    Python中的列表解析和生成器表达式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.列表解析案例 #!/usr/bin/env python #_*_coding:utf-8 ...

  3. Python全栈day18(三元运算,列表解析,生成器表达式)

    一,什么是生成器 可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用自己内置的__iter__方法),所以生成器是可迭代对象. 二,生成器分类在python中的表现形式 1 ...

  4. Python基础(9)三元表达式、列表解析、生成器表达式

    一.三元表达式 三元运算,是对简单的条件语句的缩写.   # if条件语句 if x > f: print(x) else: print(y) # 条件成立左边,不成立右边 x if x > ...

  5. python的迭代器、生成器、三元运算、列表解析、生成器表达式

    一 迭代的概念 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前 ...

  6. Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化

    一.装饰器 一.装饰器的知识储备 1.可变长参数  :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...

  7. 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式

    一.装饰器 一.装饰器的知识储备 不想修改函数的调用方式,但是还想在原来的函数前后添加功能 1.可变长参数  :*args和**kwargs def index(name,age): print(na ...

  8. Python基础:08列表解析与生成器表达式

    一:列表解析 列表解析(List comprehensions)来自函数式编程语言Haskell .它可以用来动态地创建列表.它在 Python 2.0 中被加入. 列表解析的语法:     [exp ...

  9. Python day14迭代器,三元表达式,列表解析以及生成器表达式

    1.迭代器 str=['sds','ccc','dw'] lit_1=str.__iter__()#获取迭代器 print(lit_1.__next__())#打印下一个值 # 用while做for的 ...

随机推荐

  1. Swoole WebSocket 的应用

    目录 概述 代码 小结 概述 这是关于 Swoole 学习的第三篇文章:Swoole WebSocket 的应用. 第二篇:Swoole Task 的应用 第一篇:Swoole Timer 的应用 什 ...

  2. OVS调试介绍

    基本概念 基本命令 ovs-vsctl # ovs-vsctl show 96a55a7e-f49c-4dbe-b359-bafdff2ccad7 Manager "ptcp:6640:92 ...

  3. ansible无网络安装openstack(Newton)

    概要 apt使用本地源,pip使用本地源 网络环境 物理机环境 网络名 网络地址 VLAN br-ex 192.168.200.250/24 90 br-mgmt 92.0.0.100/24 92 a ...

  4. JAVA获取本周 本月 本年 第一天和最后一天

    /** * 日期工具类 */ public class DateUtils { /** * 获取今天 * @return String * */ public static String getTod ...

  5. RVO算法

    http://blog.sina.com.cn/s/blog_6ad33d350102xqal.html 简介 在介绍VO,RVO之前,需要先介绍路径规划. 对Agent进行路径规划,实际上要完成的任 ...

  6. cogs 421. HH的项链

    421. HH的项链 http://218.28.19.228/cogs/problem/problem.php?pid=421 ★★★   输入文件:diff.in   输出文件:diff.out  ...

  7. Linux上安装Docker,并成功部署NET Core 2.0

    概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...

  8. scrapy-redis 分布式哔哩哔哩网站用户爬虫

    scrapy里面,对每次请求的url都有一个指纹,这个指纹就是判断url是否被请求过的.默认是开启指纹即一个URL请求一次.如果我们使用分布式在多台机上面爬取数据,为了让爬虫的数据不重复,我们也需要一 ...

  9. (转)通过MySQL复制线程SQL_Thread加快增量恢复binlog

    数据回档常常是使用全量备份+binlog增量实现的.而数据量很大的情况下,增量恢复binlog一直是一个苦恼的问题,因为恢复binlog速度十分慢,并且容易出错. 恢复binlog文件一般有两种方法: ...

  10. CM5.7.2 yum离线安装笔记

    一.建立yum本地服务源(yum支持http和ftp两种协议,这里使用http协议)  1.启动httpd服务   启动命令:service httpd start   关闭命令:service ht ...