(董付国)Python 学习笔记---Python序列(2)

本文介绍了Python中的列表推导式,展示了其简洁性和可读性,并通过示例解释了如何使用列表推导式进行嵌套列表的平铺、过滤元素、矩阵转置等操作。此外,还讨论了元组的不可变性、元组与列表的区别,以及序列解包在元组和列表中的应用。接着,文章提到了生成器推导式的惰性求值特性,适用于大数据处理。最后,简述了字典的创建、读取、添加、修改和删除操作,以及有序字典的概念。
摘要由CSDN通过智能技术生成

1.1.9列表推导式
列表推导式使用非常简介的方式来快速生成满足特定需求的列表,代码具有非常强的可读性。
有三种等价方法:

>>> aList=[x*x for x in range(10)]
>>> aList
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>>
>>> aList=[]
>>> aList
[]
>>> for x in range(10):
...     aList.append(x*x)
...
>>> aList
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>>
>>> aList=list(map(lambda x:x*x,range(10)))
>>> aList
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

在这里插入图片描述

>>> aList=[2**x for x in range(64)]
>>> aList
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968, 72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]
>>> sum(aList)
18446744073709551615

使用列表推导式实现嵌套列表的平铺:

>>> vec=[[1,2,3],[4,5,6],[7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

num:每个数字;elem:小列表;vec:大列表
相当于:

>>> vec=[[1,2],[3,4],[5,6],[7,8]]
>>> result = []
>>> for elem in vec:
...     for num in elem:
...             result.append(num)
...
>>> result
[1, 2, 3, 4, 5, 6, 7, 8]

如果不使用列表推导式,也可以这样:

>>> vec = [[1,2,3],[4,5,6],[7,8,9]]
>>> sum(vec,[])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> vec
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> from itertools import chain
>>> list(chain(*vec))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

*序列解包
列出当前文件夹下所有Python源文件

>>> import os
>>> [filename for filename in os.listdir('.')if filename.endswith(('.py','.pyw'))]
[]

过滤不符合条件的元素:

>>> aList=[-1,-4,6,7.5,-2.3,-9,-11]
>>> [num for num in aList if num>0]
[6, 7.5]

已知有一个包含一些同学成绩的字典,计算成绩的最高分,最低分,平均分,并查找所有最高分同学。

>>> scores={"zhang san":45,"li si":78,"wang wu":40,"zhou lin":96,"zhao qi":65,"sun ba":90,"zheng jiu":78,"wu shi":99,"dong shiyi":60}
>>> highest=max(scores.values())
>>> lowest=min(scores.values())
>>> average=sum(scores.values())*1.0/len(scores)
>>> highest,lowest,average
(99, 40, 72.33333333333333)
>>> highestPerson=[name for name,values in scores.items() if values==highest]
>>> lowestPerson=[name for name,values in scores.items() if values==lowest]
>>> highestPerson,lowestPerson
(['wu shi'], ['wang wu'])

在列表推导式中使用多个循环,实现多序列元素的任意组合,并且可以结合条件语句过滤特定元素

>>> [(x,y) for x in range(3) for y in range(3)]
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
>>> [(x,y) for x in range(1,4) for y in [3,1,4]]
[(1, 3), (1, 1), (1, 4), (2, 3), (2, 1), (2, 4), (3, 3), (3, 1), (3, 4)]

使用列表推导式实现矩阵转置

>>> matrix=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
>>> [[row[i] for row in matrix]for i in range(4)]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

也可以使用内置函数来实现矩阵转置

>>> list(zip(*matrix))                  #zip拉链函数,*序列解包,把最外面的括号去 掉
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]

列表推导式中可以使用函数或复杂表达式

>>> def f(v):
...     if v%2 == 0:
...             v=v**2
...     else:
...             v=v+1
...     return 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值