zoukankan      html  css  js  c++  java
  • Python从题目中学习:List comprehension

    九九乘法表作业其实有更简单的做法,就是用列表推导式。

    -----------------------------------------------------------------------------

    Print below multiplication table: 
    1*1=1
    1*2=2   2*2=4
    1*3=3   2*3=6   3*3=9
    1*4=4   2*4=8   3*4=12  4*4=16
    1*5=5   2*5=10  3*5=15  4*5=20  5*5=25
    1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36
    1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49
    1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64
    1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81
    --------------------------------------------------------------------------------------------

    1.列表推导式书写形式:  

    [表达式 for 变量 in 列表]    或者    [表达式 for 变量 in 列表 if 条件]

    2.介绍:

    列表推导式是利用其他列表创建新列表的一种方法,它的工作方式类似于for循环。

    简单理解就是 可以直接通过for循环生成一个list列表。

    3.举例:

    list = [1,2,3,4,5,6,7,8,9]
    
    #打印列表中 所有元素的平方
    print [x**2 for x in list] 
    #[1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    #打印列表中 大于5的元素的平方 (只需要添加if语句即可)
    print [x**2 for x in list if x>5] 
    #[36, 49, 64, 81]
    
    #打印列表中 所有元素和元素*10组成的元祖
    print [(x,x*10) for x in list]
    #[(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60), (7, 70), (8, 80), (9, 90)]
    
    #也可以在添加多个for循环
    print [(x,y) for x in range(3) for y in range(3)]
    [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
    
    print [[x,y] for x in range(3) for y in range(3)] [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]] #当然,添加多个if循环也可以 [(x, y) for x in range(10) if x % 2 if x > 3 for y in range(10) if y > 7 if y != 8] #[(5, 9), (7, 9), (9, 9)]
    list1 = [2,4,6]
    list2 = [3,6,9]
    [list1[i]+list2[2] for i in range(len(list1))]
    #[11, 13, 15]

    4.题目做法:

    >>> print "
    ".join([" ".join(["%d*%d=%d"%(secondNum,firstNum,firstNum*secondNum) for secondNum in range(1,firstNum+1)]) for firstNum in range(1,10)])
    #1*1=1
    #1*2=2 2*2=4
    #1*3=3 2*3=6 3*3=9
    #1*4=4 2*4=8 3*4=12 4*4=16
    #1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
    #1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
    #1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
    #1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
    #1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

    如果想了解list comprehension原理的东西,这个人文章写得很清楚:http://blog.chinaunix.net/uid-28631822-id-3488324.html

    5.实践:

    在来一道题,摘自《Python基础教程》:

    >>> girls = ['alice','bernice','clarice']
    >>> boys = ['chris','arnold','bob']
    >>> [b+'+'+g for b in boys for g in girls if b[0]==g[0]]
    ['chris+clarice', 'arnold+alice', 'bob+bernice']
    #当然这样也可以,脑子不要不转圈
    >>> [(b,g) for b in boys for g in girls if b[0]==g[0]]
    [('chris', 'clarice'), ('arnold', 'alice'), ('bob', 'bernice')]

    书上还提供了一种更优的方案:

    >>> for girl in girls:
        letterGirls.setdefault(girl[0],[]).append(girl)
    >>> [b+'+'+g for b in boys for g in letterGirls[b[0]]]
    #['chris+clarice', 'chris+clarice', 'arnold+alice', 'arnold+alice', 'bob+bernice', 'bob+bernice']
    
    #解释一下:
    #letterGirls.setdefault(girl[0],[]) 之后
    >>> print letterGirls
    #{'a': [], 'c': [], 'b': []}
    
    #letterGirls.setdefault(girl[0],[]).append(girl)之后
    >>> letterGirls
    {'a': ['alice'], 'c': ['clarice'], 'b': ['bernice']}
    
    #for循环遍历字典,得到的是key值
    #setdefault(key,value),如果没有value值就更新,有的话就不更新值。
  • 相关阅读:
    C#中Windows通用的回车转Tab方法
    对Form_Load事件的一点想法
    关于粉笔灰对教师影响的解决方案
    今天才发现MSSQLServer2000的排序功能原来这样
    C# 2.0与泛型
    (收藏)Anders Hejlsberg谈C#、Java和C++中的泛型
    对接口interface的一点想法
    马的遍历
    推荐软件:工作时间提醒器
    pgpoolII 介绍
  • 原文地址:https://www.cnblogs.com/dzblog/p/3951620.html
Copyright © 2011-2022 走看看