python学习记录(6)——列表解析式

列表解析式

列表解析式常用于实现创建新的列表,不会因为简写而影响效率,反而会提高效率。减少程序员工作量,减少出错。
举例,输出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. 形式1: {expr(item) for item in iterable if cond_expr(item)}
    (也可以使用中括号、小括号包裹)
    第一部分:元素,对元素的操作(运算与函数都可以)
    第二部分:遍历行为
    第三部分:筛选条件(可选),应该注意if条件后面不能再跟elif或else
    最后:用小括号,中括号,大括号包含住三部分,得到不同的数据结构或对象
  2. 形式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']

小括号、大括号解析式

  1. 使用小括号做解析式并不会返回一个不可变元组而是生成器,占用O(1)内存空间。
  2. 大括号解析式则比较普通,使用大括号解析可以得到集合或字典。

要生成字典时使用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}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值