zoukankan      html  css  js  c++  java
  • Python List Comprehension

    (一)使用List Comprehension的好处 

     在了解Python的List Comprehension之前,我们习惯使用for循环创建列表,比如下面的例子:

    numbers = range(10)
    
    my_list = []
    for number in numbers:
        my_list.append(number * number)
    print(my_list)

    可是在Python中,我们有更简洁,可读性更好的方式创建列表,就是List Comprehension:

    my_list = [number * number for number in numbers]

    我们也可以用map加上lambda实现上述List Comprehension的功能:

    my_list = map(lambda a: a*a, numbers)

    上面三个代码段的功能类似,除了map函数返回的是iterator,但是从可读性来说,List Comprehension是最好的

    (二)一些较为复杂的List Comprehension

    (1)加上if判断条件的List Comprehension:

    my_list = [number for number in numbers if number % 2 == 0]

    (2)多个维度,可以包含多个for

    colors = ['Black', 'White']
    sizes = ['S', 'M', 'L']
    tshirts = [(color, size) for color in colors for size in sizes]

    (三)Dictionary/Set Comprehension

    与List Comprehension类似,我们可以对Dictionary和Set操作:

    假设我们有如下两个列表:

    names = ['Bruce', 'Clark', 'Peter', 'Logan', 'Wade']
    heros = ['Batman', 'Superman', 'Spiderman', 'Wolverine', 'Deadpool']

    我们利用内置函数zip将上面两个列表打包成包含元组的iterator zip(names, heros) ,用for循环输出如下:

    ('Bruce', 'Batman')
    ('Clark', 'Superman')
    ('Peter', 'Spiderman')
    ('Logan', 'Wolverine')
    ('Wade', 'Deadpool')

    如果使用for循环把上面的iterator生成字典的话,代码如下:

    my_dict = []
    for name, hero in zip(names, heros):
        my_dict[name] = hero
    print(my_dict)

    而用Dictionary Comprehension的等价代码是这样的:

    my_dict = {name: hero for name, hero in zip(names, heros)}
    print(my_dict)

    是不是更为简洁?同样也有Set Comprehension:

    numbers = [1, 1, 2, 2, 2, 3, 4, 5]
    my_set = {number for number in numbers}
    print(my_set)

    (四)Generator Comprehension

     生成器表达式与列表或其他序列类型相比,更节省内存,因为它一次只产出一个值,与List Comprehension的语法非常类似,只是不用[],而使用(),

    比如我们求字母序列的ASCII码:

    letters = 'ABCDEFG'
    genexp_1etters = (ord(letter) for letter in letters)
    for letter in genexp_1etters:
        print(letter)

    程序输出ABCDEF的ASCII码 65 - 71.

  • 相关阅读:
    程序如何调取焦点轮换图的每一张图片
    做一个网站程序的小小感悟
    点击repeater的一个修改事件触发全部repeater每一行的修改事件
    将两个时间组合,结果为2015年4月8日-4月10日
    转 c# 日期函数[string.Format----GetDateTimeFormats]格式 .
    关于后台管理linkbutton按钮几个重要属性的理解
    循环repeater中的每一列,并计算数据和
    上传图片2
    isinstance和issubclass
    类和对象的绑定方法和非绑定方法
  • 原文地址:https://www.cnblogs.com/z-joshua/p/9122578.html
Copyright © 2011-2022 走看看