列表解析式
列表解析式常用于实现创建新的列表,不会因为简写而影响效率,反而会提高效率。减少程序员工作量,减少出错。
举例,输出0-10的偶数:
#不用解析式的一般写法
size = 10
even_numbers = []
n = 0
while n < size:
if n % 2==0:
even_numbers.append(n)
n += 1
print(even_numbers)
#使用解析式
even_numbers=[ x for x in range(10) if x % 2==0 ]
print(even_numbers)
由此可见,列表解析式的方法极大的简略了代码,但同时可读性也增强了。
形式
- 形式1: {expr(item) for item in iterable if cond_expr(item)}
(也可以使用中括号、小括号包裹)
第一部分:元素,对元素的操作(运算与函数都可以)
第二部分:遍历行为
第三部分:筛选条件(可选),应该注意if条件后面不能再跟elif或else
最后:用小括号,中括号,大括号包含住三部分,得到不同的数据结构或对象 - 形式2: {if cond_expr(item) else cond_expr(item) for item in iterable}
在一个列表生成式中,for前面的if … else是表达式,而for后面的if是过滤条件,不能带else。
中括号解析式
enumerate() 函数返回生成器,生成器每次给出下标和Iterable的内容。一般用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用于 for 循环当中。
对比:
#range函数或一般的sequence,遍历的只有元素的值
for i in range(10):
print(i)
#enumerate函数遍历的是元素的下标和值
for id, value in enumerate(10):
print(i)
例子:
test =['Ainur','Dragons','Dwarves','Elves','Ents','Hobbits','Men','Orcs']
print(['{0}:{1}'.format(idx,element) for idx,element in enumerate(test) ])
['0:Ainur', '1:Dragons', '2:Dwarves', '3:Elves', '4:Ents', '5:Hobbits', '6:Men', '7:Orcs']
小括号、大括号解析式
- 使用小括号做解析式并不会返回一个不可变元组而是生成器,占用O(1)内存空间。
- 大括号解析式则比较普通,使用大括号解析可以得到集合或字典。
要生成字典时使用key:value的形式:
想要生成键为下标的可以对列表使用enumerate函数
x = range(10)
print({ idx:i**2 for idx,i in enumerate(x) if i%2==0 })
{0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
用两个for函数时会出现如下状况:key是去重的,而value不会,所以第一个循环的元素带入第二个循环时,会与第二个循环的最后一个元素组成key:value,导致最后所有的value都是最后一个值。
{key:value for key in "ABC" for value in range(1,10)}
{'A': 9, 'B': 9, 'C': 9}
想要自定义的键值对可以使用下述写法:
{key:value for key,value in [(1,11),(2,22),(3,33)]}
{1: 11, 2: 22, 3: 33}