zoukankan      html  css  js  c++  java
  • 生成器表达式和其他数据推导式

    生成器表达式和其他数据推导式

    一 列表解析式

    先看一个例子:

    egg_list=['鸡蛋%s' %i for i in range(10)] #列表解析
    laomuji=('鸡蛋%s' %i for i in range(10))#生成器表达式
    print(laomuji)
    print(next(laomuji)) #next本质就是调用__next__
    print(laomuji.__next__())
    print(next(laomuji))
    

    结果如下:

    <generator object at 0x0000026AD2024888>
    鸡蛋0
    鸡蛋1
    鸡蛋2

    总结:
    1.把列表解析的[]换成()得到的就是生成器表达式
    2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
    3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:
    sum(x ** 2 for x in range(4))
    而不用多此一举的先构造一个列表:
    sum([x ** 2 for x in range(4)])
    下面的代码是等效的,但使用列表解析使得代码更简洁。

    egg_list=['鸡蛋%s'%i for i in range(10)]    #列表推导式
    print(egg_list)
    
    egg_list = []
    for i in range(10):
        egg_list.append('鸡蛋%s'%i)
    print(egg_list)
    
    二 生成器表达式和列表表达式的区别

    1 括号不一样
    2 返回的值不一样
    3 生成器表达式几乎不占用内存

    三 各种推导式详解

    之前我们已经学习了最简单的列表推导式和生成器表达式。但是除此之外,其实还有字典推导式、集合推导式等等。

    下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式。

    variable = [out_exp_res for out_exp in input_list if out_exp == 2]
      #out_exp_res:列表生成元素表达式,可以是有返回值的函数。
      #for out_exp in input_list:迭代input_list将out_exp传入    out_exp_res表达式中。
      #if out_exp == 2:根据条件过滤哪些值可以。
    

    常用的有两种模式:

    1 [每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]    #遍历之后挨个处理
    2 [满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]   #筛选功能
    
    1 列表推导式

    例一:30以内所有能被3整除的数

    multiples = [i for i in range(30) if i % 3 is 0]
    print(multiples)
    # Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
    

    例三:找到嵌套列表中名字含有两个‘e’的所有名字

    names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
             ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
    
    print([name for lst in names for name in lst if name.count('e') >= 2]) 
    # 注意遍历顺序,这是实现的关键
    #Output:['Jefferson', 'Wesley', 'Steven', 'Jennifer']
    
    1 字典推导式

    例一:将一个字典的key和value对调

    dic1 = {'1':'cosmo','2':'xiaoma'}
    dic2={dic1[key]:key for key in dic1 }
    print(dic2)
    

    Output:

    {'cosmo': '1', 'xiaoma': '2'}

    例二:合并大小写对应的value值,将k统一成小写

    mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
    mcase_frequency = {k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase.keys()}
    print(mcase_frequency)
    

    Output:

    {'a': 17, 'b': 34, 'z': 3}
    dic.get() 方法和 dic[key] 方法的不同,这两种方法都是用来获取字典中 key 对应的 value,一般情况下似乎没有什么区别:

    >>> dic = {1:'This is 1', 2:'This is 2'}
    >>> dic[1]
    'This is 1'
    >>> dic.get(2)
    'This is 2'
    

    get() 方法和 [key] 方法的主要区别在于,[key] 在遇到不存在的 key 时会抛出 KeyError 错误,但Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。具体如下:
    语法
    get()方法语法:
    dict.get(key, default=None)
    参数
    key -- 字典中要查找的键。
    default -- 如果指定键的值不存在时,返回该默认值值。
    返回值
    返回指定键的值,如果值不在字典中返回默认值None。

    1 集合推导式

    例:计算列表中每个值的平方,自带去重功能

    squared = {x**2 for x in [1, -1, 2]}
    print(squared)
    # Output: set([1, 4])
    
  • 相关阅读:
    POJ 1003 解题报告
    POJ 1004 解题报告
    POJ-1002 解题报告
    vi--文本编辑常用快捷键之光标移动
    常用图表工具
    September 05th 2017 Week 36th Tuesday
    September 04th 2017 Week 36th Monday
    September 03rd 2017 Week 36th Sunday
    September 02nd 2017 Week 35th Saturday
    September 01st 2017 Week 35th Friday
  • 原文地址:https://www.cnblogs.com/ChinacloudTech/p/9943737.html
Copyright © 2011-2022 走看看