zoukankan      html  css  js  c++  java
  • 列表生成式

    列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

    举个例子,要生成list [0,1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(11))

    >>> list(range(11))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:

    >>> L = []
    >>> for x in range(1,11):
    	L.append(x*x)
    
    	
    >>> L
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    >>> 
    

    但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:

    >>> [x * x for x in range(1, 11)]
    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    

    写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

    for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

    >>> [x * x for x in range(1, 11) if x % 2 == 0]
    [4, 16, 36, 64, 100]
    >>> 
    

    还可以使用两层循环,可以生成全排列:

    >>> [m + n for m in 'ABC' for n in 'XYZ']
    ['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
    >>> 
    

    三层和三层以上的循环就很少用到了。

    运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:

    >>> import os
    >>> [d for d in os.listdir('.')]
    ['DLLs', 'Doc', 'f00.txt', 'include', 'Lib', 'libs', 'LICENSE.txt', 'NEWS.txt', 'python.exe', 'pythonw.exe', 'README.txt', 'Scripts', 'tcl', 'Tools']
    

     for循环其实可以同时使用两个甚至多个变量,比如dictitems()可以同时迭代key和value:

    >>> d = {'x':'A', 'y':'B', 'z':'C'}
    >>> for k, v in d.items():
    	print(k, '=', v)
    
    	
    y = B
    x = A
    z = C
    >>>
    

    因此,列表生成式也可以使用两个变量来生成list:

    >>> [k + '=' + v for k, v in d.items()]
    ['y=B', 'x=A', 'z=C']
    >>> 
    

    最后把一个list中所有的字符串变成小写:

    >>> L = ['Hello', 'World', 'IBM', 'Apple']
    >>> [s.lower() for s in L]
    ['hello', 'world', 'ibm', 'apple']
    >>> 
    

    练习

    如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错:

    >>> L = ['Hello', 'World', 18, 'Apple', None]
    >>> [s.lower() for s in L]
    Traceback (most recent call last):
      File "<pyshell#24>", line 1, in <module>
        [s.lower() for s in L]
      File "<pyshell#24>", line 1, in <listcomp>
        [s.lower() for s in L]
    AttributeError: 'int' object has no attribute 'lower'
    >>> 
    

    使用内建的isinstance函数可以判断一个变量是不是字符串:

    >>> x = 'abc'
    >>> isinstance(x, str)
    True
    >>> isinstance(x, int)
    False
    >>> y = 123
    >>> isinstance(x, int)
    False
    >>> 
    

    将L1中的字符串元素过滤存储于L2中:

    >>> L1 = ['Hello', 'World', 18, 'Apple', None]
    >>> L2 = [str1 for str1 in L1 if isinstance(str1, str)]
    >>> L2
    ['Hello', 'World', 'Apple']
    >>> 
    

    参考: http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431779637539089fd627094a43a8a7c77e6102e3a811000

  • 相关阅读:
    redis和memcache的区别
    c语言行编辑程序
    C语言栈的实现
    双向链表
    静态链表的合并
    静态链表的创建
    链表
    将非递减有序排列(L L1)归并为一个新的线性表L2 线性表L2中的元素仍按值非递减
    C语言合并两个集合(L,L1) 将L1中不在L中的元素插入到L线性表中
    oracle--JOB任务
  • 原文地址:https://www.cnblogs.com/ant-colonies/p/6664996.html
Copyright © 2011-2022 走看看