本篇将介绍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. angular $compiler

    directive是如何被compiled HTML编译发生在三个阶段: 1.$compile遍历DOM节点匹配directives 如果compiler找到元素上的directive,directi ...

  2. java 基础语法 1

    一.标识符 二.关键字 三.JAVA基础数据类型 3.1. java常量 3.2. java变量 从本质上来讲,变量其实是内存里面的一小块区域,一个程序在运行的时候,实际上这个程序是位于内存里面,然后 ...

  3. centos7.2 linux 64位系统上安装mysql

    1.在线安装mysql 在终端中命令行下输入(在官网下载mysql): # wget https://dev.mysql.com/downloads/repo/yum/mysql57-communit ...

  4. mint-ui vue双向绑定

    由于最近项目需求,用上了mint-ui来重构移动端页面,从框架本身来讲我觉得很强大了,用起来也很不错,但是文档就真的是,,,,让我无言以对,给的api对于我们这些小菜鸟来讲真的是处处是坑呀(ps:用v ...

  5. End up with More Teams UVA - 11088

    End up with More Teams Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu ...

  6. bzoj1806 [Ioi2007]Miners矿工配餐

    [bzoj1806][Ioi2007]Miners 矿工配餐 2014年7月10日1,7870 Description 现有两个煤矿,每个煤矿都雇用一组矿工.采煤工作很辛苦,所以矿工们需要良好饮食.每 ...

  7. [SDOI2009]晨跑

    又是一道山东省选的题目,居然题目又十分水100行的代码就随随便便AC了. Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止 ...

  8. spring cloud+dotnet core搭建微服务架构:Api网关(三)

    前言 国庆假期,一直没有时间更新. 根据群里面的同学的提问,强烈推荐大家先熟悉下spring cloud.文章下面有纯洁大神的spring cloud系列. 上一章最后说了,因为服务是不对外暴露的,所 ...

  9. CLR via 随书笔记

    CTS(common type system) 通用类型系统规定,一个类型可以包含零个或者多个成员,如下:   字段(Field): 作为对象状态一部分的数据变量.字段根据名称和类型来区分   方法( ...

  10. zoj 2136 Longest Ordered Subsequence 最长上升子序列 新思路

    Longest Ordered Subsequence Time Limit: 2 Seconds      Memory Limit: 65536 KB A numeric sequence of ...