本篇将介绍Python的列表生成式,更多内容请参考:Python学习指南

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

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

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

但是要生成[1×1, 2×2, 3×3, 4×4,..., 10×10]怎么做?方法一是循环:

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

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

>>>[x*x for x in range(1, 11)]
[1, 4, 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, 64, 100]

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

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

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

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

>>>import os #导入os模块
>>>[d for d in os.listdir('.')] #os.listdir可以列出文件和目录

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:

>>>d = {'x':'A', 'y':'B', 'z':'C'}
>>>[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']

复杂表达式

1、使用for循环的迭代不仅可以迭代普通的list,还可以迭代dict。

假设有如下的dict:

d = {'Adam':95, 'Lisa':85, 'Bart':59}

完全可以通过一个复杂的列表生成式把它变成一个HTML表格:

tds = ['<tr><td>%s</td><td>%s</td></tr>'%(name, score) for name, score in d.items()]
print('<table>')
print('<tr><th>Name</th><th>Score</th></tr>')
print '\n'.join(tds)
print('</table>')

注意:字符串可以通过%进行格式化,用指定的参数替代%s。字符串的join()方法可以把一个list拼接成一个字符串。

2、在生成的表格中,对于没有及格的同学,请把分数标记为红色。

d = {'Adam':95, "Lisa":85, "Bart":59}
def generate_tr(name, score):
if score < 60:
return '<tr><td>%s</td><td style="color:red">%s</td></tr>' %s(name, score)
return '<tr><td>Name</td><td>Score</td></tr>'%(name, score) tds = [generate_tr(name, score) for name, score in d.items()]
print('<table border = "1">')
print('\n'.join(tds))
print('</table>')

3、条件过滤

列表生成式的for循环后面还可以加上if判断,例如:

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

如果我们只想要偶数的平方,不改动range()的情况下,可以加上if来筛选:

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

有了if条件,只有if判断为True的时候,才把循环的当前元素添加到列表中。

编写一个函数,它接收一个list,然后把list中的所有字符串变成大写后返回,非字符串元素将被忽略。

[x.upper() for x in L if isinstance(x, str)]

参考

  1. 列表生成式--学习笔记
  2. 廖雪峰-生成式

python生成式的更多相关文章

  1. python 生成式和生成器

    #!/usr/bin/env python # -*- coding:utf-8 -*- # @Time : 2017/10/17 21:46 # @Author : lijunjiang # @Fi ...

  2. python生成式:列表、字典、集合

    python的3类生成式: 列表生成式 字典生成式 集合生成式 1.python列表生成式 my_data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(&quo ...

  3. python生成式和生成器

    一,生成式和生成器 1,列表生成式 mylist = [ i*i for i in range(3) if i>1 ] print(mylist) 运行结果:[4] 可以发现,快速生成列表的表达 ...

  4. python 生成式,生成器,迭代器,可迭代

    1.生成器就是迭代器2.生成式用[](中括号)包起来,生成器用()(圆括号)包起来3.生成式在使用前已经在内存中存在,生成器只有在使用时才生成4.迭代器是可以用.__next__()不断取出下一值,直 ...

  5. python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)

    1.1迭代器 什么是迭代器: 迭代器是一个可以记住遍历的位置对象 迭代器对象从集合的第一个元素元素开始访问,直到所有元素被访问完结束,迭代器只能往前不会后退. 迭代器有两个基本方法:iter ,nex ...

  6. python【5】-生成式,生成器

    一.条件和循环 1. if语句 if <条件判断1>: <执行1> elif <条件判断2>: <执行2> else: <执行4> 例如: ...

  7. python基础——列表生成式

    python基础——列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 举个例子,要生成list [1, 2, 3, 4 ...

  8. python学习笔记——列表生成式与生成器

    1.列表生成式(List Comprehensions) python中,列表生成式是用来创建列表的,相较于用循环实现更为简洁.举个例子,生成[1*1, 2*2, ... , 10*10],循环用三行 ...

  9. Python的高级特性之切片、迭代、列表生成式、生成器

    切片 切片就是获取一个list.tuple.字符串等的部分元素 l = range(100) #取[0,5)元素 print(l[:5]) #[0, 1, 2, 3, 4] #在[0,99]中每隔10 ...

随机推荐

  1. Qt学习之路MainWindow学习过程中的知识点

    一.Qt的GUI程序有一个常用的顶层窗口,叫做MainWindow MainWindow继承自QMainWindow.QMainWindow窗口分成几个主要的区域:   二.QAction类 QAct ...

  2. apollo实现c#与android消息推送(一)

    之前做了c#推送消息到手机端,限于网络要求,不能使用百度等现成的推送,查了许多资料,七拼八凑终于凑齐,记录下来,即是复习也是希望对来者有所帮助. 我开发的环境是windows,使用java开发的Apa ...

  3. Kia's Calculation hdu4726

    Kia's Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. servlet自动获取前端页面提交数据

    servlet自动获取前端页面jsp提交数据 以下是本人在学习过程中,因前端页面提交参数过多,后台servlet封装实体类过于麻烦而写的一个工具类,应用于jsp/servlet数据提交后,基于MVC+ ...

  5. Select的option事件问题

    一开始看你们会觉得没问题,我也就是觉得没问题所以才找不到错误所在. 问题出在option本身是没有事件的说法的,只能在select里添加事件,再获取option的属性值 这是我的写法 select设置 ...

  6. FPGA在其他领域的应用(三)

    广播领域: 专业的A/V(音频/视频),和演播室行业正在经历着激动人心的变化,例如,UHD/8K (超高清)视频.多平台内容交付.IP网络传输和云计算.2016里约奥运会使用4K分辨率视频播放,而日本 ...

  7. M-定在下边的区域

    1 效果 2 布局 3 样式

  8. Python之scrapy实例1

    下文参考:http://www.jb51.net/article/57183.htm 个人也是稍加整理,修改其中的一些错误,这些错误与scrapy版本选择有关,个环境:Win7x64_SP1 + Py ...

  9. Win10系统下安装Ubuntu16.04.3教程与设置

    在Win10上刚刚装好Ubuntu16.04.3,装了不下于10次,期间出现很多问题,趁着还有记忆,写下这篇教程,里面还有Ubuntu系统的优化与Win10的一些设置. Part 1 制作Ubuntu ...

  10. python3.6安装pyspider

    win10下安装pyspider 1.pip 我在安装pip的时候默认安装了Pip. 如果没有的话:pip安装 2.PhantomJS PhantomJS 是一个基于 WebKit 的服务器端 Jav ...