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

  • 相关阅读:
    node相关--socket.io
    node相关--WebSocket
    node工具--express
    node工具--connect
    HTTP基础01--web与互联网基础
    nodeAPI--HTTP
    nodeAPI--TCP
    js:语言精髓笔记13--语言技巧
    js:语言精髓笔记12--动态语言特性(2)
    js:语言精髓笔记11--动态语言特性(1)
  • 原文地址:https://www.cnblogs.com/Python666/p/6726809.html
Copyright © 2020-2023  润新知