python之字典、列表、元组生成器的使用
2024-10-13 07:11:58
前言
python的生成式在一些类型相互转换的时候可以写出十分优雅的代码,如列表转换成另一个列表、字典、或元组,并且代码的执行效率也比使用for...in...循环高。
系列文章
列表生成式
列表生成式即生成列表的生成式,写法简单而优雅,可以将多行代码融合成一行。主要的作用是将其他对象转换成列表或对原来的列表进行过滤。
列表生成式的代码效率是高于多行循环结构的,原因是将原本多行代码融合一行,解释加快。
# 列表转换列表
ls = [1,2,4,6]
ls1 = [x**2 for x in ls]
print(ls1)
结果:[1,4,16,36]
# 也可以这样
list(x**2 for x in range(10))
# 对列表过滤,返回true的才会保留到列表
ls = [1,2,4,6]
ls1 = [x**2 for x in ls if x > 3]
print(ls1)
结果:[16, 36]
# 多条件过滤
ls = [1,2,4,6]
ls1 = [x**2 if x > 2 else x**3 for x in ls]
print(ls1)
结果:[1, 8, 16, 36]
# 多重循环
ls = [1,2,4,6]
ls1 = [x**y if x > 2 else x**3 for x in ls for y in ls]
print(ls1)
结果:[1, 1, 1, 1, 8, 8, 8, 8, 4, 16, 256, 4096, 6, 36, 1296, 46656]
生成器生成式
在涉及到需要遍历列表而不是针对列表的某个值操作时,使用生成器代替列表可以减少内存的消耗。
ls = [1,2,4,6]
ls1 = (x**2 for x in ls)
print(ls1)
结果:<generator object <genexpr> at 0x0000021B21DED150>
# 当然我们也可以这样
def gener(l):
for x in l:
yield x**2
# 只不过定义结构偏重型,当操作复杂的时候才采用
# 通过for..in取数据不需要处理StopIteration
for i in ls1:
pass
# next()方法需要处理StopIteration
while True:
try:
print(next(ls1))
except StopIteration:
pass
字典生成式
字典生成式在一些需要列表或元组转化成字典的场合可以写出很优雅的代码。
# dict()可以接受类似列表生成式的写法,前提是ls至少是二维可迭代对象,否则报错
ls = [('name1','xiao'),('name2','wang')]
dict_ls = dict(x for x in ls)
print(dict_ls)
结果:{'name1': 'xiao', 'name2': 'wang'}
# 也可以针对zip使用
d = dict(zip([1,2],[3,4,]))
print(d)
# 结果
{1: 3, 2: 4}
# 直接和列表生成式相似的写法
d = {x:y for x,y in enumerate(range(10))}
集合生成式
按照列表生成式类似的写法我们可以写集合生成式。
print(set(i for i in range(5)))
print({i for i in range(5)})
print(frozenset(i for i in range(5)))
# 结果
{0, 1, 2, 3, 4}
{0, 1, 2, 3, 4}
frozenset({0, 1, 2, 3, 4})
元组生成式
由于()这个类似列表生成式的形式被生成器占用了,所有元组生成式使用tuple()来进行。
ls = [('name1',['1','2']),('name2','wang')]
dict_ls = tuple(x for x in ls)
print(dict_ls)
结果:(('name1', ['1', '2']), ('name2', 'wang'))
条件表达式代码压缩
对于一些如果代码不算长的if...else...的判断情况,可以将代码写在一行,显得非常的优雅。
x = 1 if 1>0 else None
参考
最新文章
- android-plugmgr源代码分析
- Java ConcurrentHashMap Example and Iterator--转
- How to upgrade Subversion on OSX
- Spark Streaming、HDFS结合Spark JDBC External DataSouces处理案例
- 神奇的 echo 命令
- js之阻止事件冒泡(待修改)和阻止默认事件
- .net 调用C++类库
- input中id和name属性的区别。
- vim使用大全
- SetTimer and CreateWaitableTimer的例子(静态函数设置为回调函数,瑞士的网页,有点意思)
- [AngularJS] ngPluralize
- OrderAction
- wamp出现问题#1045 - Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: NO)的解决方法
- 新到的Mac配置Java开发环境
- response.getWriter().write()产生乱码
- Day 1 上午
- Mac新手入门使用教程 - Finder 技巧
- C#压缩解压文件
- Generative Adversarial Nets[content]
- Js/如何操作div下面的span元素或者是img之类的标签元素