前言

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

参考

python之字典、列表、元组生成器的使用的更多相关文章

  1. python将字典列表导出为Excel文件的方法

    将如下的字典列表内容导出为Excel表格文件形式: ​ 关于上图字典列表的写入,请参考文章:https://blog.csdn.net/weixin_39082390/article/details/ ...

  2. python基础(五)列表,元组,集合

    列表 在python中是由数个有序的元素组成的数据结构,每一个元素对应一个index索引来隐式标注元素在列表中的位置.是python中最常用的一种数据类型.需要注意的是列表中可以有重复相同的数据. 列 ...

  3. python空字典列表两种生成方式对赋值带来的不同影响

    最近在实现朴素贝叶斯算法碰到一个很有趣的现象(基于Python3.6.3) 我生成一个由10个空字典构成的列表: 第一种生成方式(可能大多数人都会用这种方法,形式简单) >>a = [{} ...

  4. python学习之列表元组,字典

    list:元素性质可以不一致,元素还可以是list,可类似数组方法进行索引(也可以用负数索引,-1表示最后一个),可用.append('')进行动态增加,可用pop()删除最后一个或者pop(i)删除 ...

  5. Python初学笔记列表&元组&字典

    一.从键盘获取 1 print("请输入") 2 username = input("姓名:") 3 age = input("年龄:") ...

  6. python 序列结构-列表,元组,字典,字符串,集合

    列表 """ name_list.__add__( name_list.__getslice__( name_list.__new__( name_list.append ...

  7. python字符串字典列表互转

    #-*-coding:utf-8-*- #1.字典 dict = {'name': 'Zara', 'age': 7, 'class': 'First'} #字典转为字符串,返回:<type ' ...

  8. python之路(列表,元组)

    列表 list:基础数据类型之一,可以索引,切片,步长,切片+步长可以增删改查,可迭代,可嵌套字典,元组,列表 一.索引,切片,步长 list01 = [1,2,3,'eric','west'] 1. ...

  9. python记录_day04 列表 元组

    今日主要内容: 列表 和 元组 列表 一.列表介绍 列表是一种能存储大量数据的数据结构,是能装对象的对象.由方括号 [] 括起来,能放任意类型的数据,数据之间用逗号隔开 列表存储数据是有顺序的 二.增 ...

  10. python 学习分享-列表元组篇

    1 列表(list) 下面的代码就是把一个变量赋值为列表 a=['laay','aay','ay','y'] 列表中存在索引,可以通过索引来访问列表中的值,也可以通过索引完成切片 print(a[0] ...

随机推荐

  1. 关于JavaScript中的几种匿名行数的写法

     匿名函数没有实际名字,也没有指针,怎么执行滴? 其实大家可以看看小括号的意义就应该可以理解.小括号有返回值,也就是小括号内的函数或者表达式的返回值,所以说小括号内的function返回值等于小括 ...

  2. Swift基础之UIButton

    //设置全局变量,将下面的替换即可    //var myButton = UIButton();    //系统生成的viewDidLoad()方法    override func viewDid ...

  3. Windows环境下搭建React Native

    随着移动开发越来越火热,前端开发也是有之前11年一直火热到现在,不过我发现从去年年底开发,Android和ios基本已经饱和了,特别是随着广大开源社区的中很多人贡献代码,开发已经不是什么问题了,所以现 ...

  4. Android官方技术文档翻译——新构建系统概述

    本文译自Android官方技术文档<New Build System>,原文地址:http://tools.android.com/tech-docs/new-build-system. ...

  5. Tomcat configuration DataSource

    1. configuration MySql Connection DataSource 原理介绍 java 调用 Tomcat 中的 ConnectionPool 通过Context 中去查找  j ...

  6. HBase BlockCache

    1. Cache 读写  调用逻辑:  hmaster.handleCreateTable->HRegion.createHRegion-> HRegion. initialize-> ...

  7. 《老罗的Android之旅》导读PPT

    虽然好几个月没更新博客了,但是老罗一直有在准备可以分享的东西的.除了早前在微博分享Android4.2相关技术之外,这次还特意准备了13个PPT,总结之前所研究过的东西.内容从Android组件设计思 ...

  8. Yii2.0源码阅读-PHP如何与redis通信?

    PHP与Redis可以通过socket进行通信,前提是PHP需要实现Redis的协议 RESP协议描述: 字符串 \r\n : 表示一个正确的状态信息,具体信息是'+'后面的字符(Simple Str ...

  9. JVM学习--(二)内存模型、可见性、指令重排序

    我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...

  10. BAT面试技巧

    很多人都质疑面试前去google一下面试题,是否有用....其实真实情况往往是这样:前台告诉经理,有个面试者来了,经理一拍头:啊!差点忘了!拿起电话:小谢,你有空吧,帮忙面个试! 小谢答应后,goog ...