zoukankan      html  css  js  c++  java
  • Python 列表解析list comprehension和生成表达式generator expression

    如果想通过操作和处理一个序列(或其他的可迭代对象)来创建一个新的列表时可以使用列表解析(List comprehensions)和生成表达式(generator expression)

    (1)list comprehension

    [expr for iter_var in iterable ] or [expr for iter_ in iterable if cond_expr]

    l1=[1,2,3,4,5]
    
    [x+1 for x in l1]
    
    [2, 3, 4, 5, 6]
    
    [x-1 for x in l1 if x>3]
    
    [3, 4]
    
    dict([(x,x+1) for x in l1])
    
    {1: 2, 2: 3, 3: 4, 4: 5, 5: 6}
    
    vec1=[1,2,3]
    vec2=[6,7,8]
    sq=[vec1[i]+vec2[i] for i in range(len(vec1))]
    print sq
    
    [7, 9, 11]
    
    [x*y for x in [1,2,3] for y in [3,4,5]]
    
    [3, 4, 5, 6, 8, 10, 9, 12, 15]

    [(x+y) for x in l1 for y in range(x)]

    [1, 2, 3, 3, 4, 5, 4, 5, 6, 7, 5, 6, 7, 8, 9]
    def t_f(x): return x+1 [t_f(i) for i in l1] [1, 2, 3, 4, 5] 等价于 map(t_f,l1)

    (2)generator expression

    通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以应当考虑使用生成器表达式而不是列表解析.生成器表达式并不真正创建数字列表, 而是返回一个生成器generator,generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。但是我们一般通过for循环来迭代它,并且不需要关心StopIteration的错误。


    for n in g:
    print(n)

    由于这个生成器在每次计算出一个条目后,把这个条目“产生”(yield)出来。 生成器表达式使用了“惰性计算”(lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调用call by need的方式翻译为惰性更好一些),只有在检索时才被赋值( evaluated),所以在列表比较长的情况下使用内存上更有效.A generator object in python is something like a lazy list. The elements are only evaluated as soon as you iterate over them. 

    (expr for iter_var in iterable) or (expr for iter_var in interable if cond_expr)

    ge1=(x+1 for x in l1 if x%2)
    ge1
    
    <generator object <genexpr> at 0x000000000959EA68>
    
    type(ge1)
    
    generator
    
    for i in ge1:
        print i
    
    [1, 2, 3, 4, 5]

    some adds:

    1)当需要只是执行一个循环的时候尽量使用循环而不是列表解析,这样更符合python提倡的直观性

    2)当有内建的操作或者类型能够以更直接的方式实现的,不要使用列表解析

    good:
    l2=l1
    
    bad:
    l2=[x for x in l1]

    3)如果需要对每个元素都调用并且返回结果时,应使用L1=map(f,L), 而不是 L1=[f(x) for x in L]

  • 相关阅读:
    bae问题
    union intersect minus
    在搭建SpringMvc Hibernate框架时遇到的问题
    详细解读Spring2.5 +Struts1.3 框架(使用Spring声明式事物管理和springjjdbc模板)
    javaee缓存技术 oscache ehcache
    Warning
    Math
    Test
    网络流24题-最小路径覆盖问题
    Wannafly summer camp Day3--Knight
  • 原文地址:https://www.cnblogs.com/dadadechengzi/p/6292156.html
Copyright © 2011-2022 走看看