推导式(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导,在Python2和3中都有支持:

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式

1、列表推导式

列表推导式提供一个生成列表的简洁方法。常见的应用是创建新列表,其中每个元素是应用于另一序列或可迭代的每个成员的一些操作的结果,或者创建那些满足特定条件的元素的子序列。

其基本格式如下:

variable = [out_exp_res for out_exp in input_list if out_exp == 2]

out_exp_res:列表生成元素表达式,可以是有返回值的函数。
for out_exp in input_list:迭代input_list将out_exp传入out_exp_res表达式中。
if out_exp == 2:根据条件过滤哪些值可以。过滤条件可有可无,取决于实际应用

例如,假设我们要创建一个平方数列表,如:

squares = []
for x in range(10):squares.append(x**2)print(squares)

以上代码,输出:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

注意,上面这个创建(或者覆盖)了一个名为x的变量,它在循环结束时仍然存在。我们可以计算没有任何副作用的平方数列表:

squares = list(map(lambda x: x**2, range(10)))

或者,等价地:

squares = [x**2 for x in range(10)]

上面这个方法更加简明且易读。

列表推导式由一对方括号组成,方括号包含一个表达式,其后跟随一个for子句,然后是零个或多个for或if子句。结果将是一个新的列表,其值来自将表达式在其后的for和if子句的上下文中求值得到的结果。例如,如果这两个列表的元素不相等,则此listcomp组合两个列表的元素:

squares = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
print(squares)

它等效于:

squares = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]for x in [1, 2, 3]:for y in [3, 1, 4]:if x != y:squares.append((x, y))print(squares)

注意这两个代码片段中,for和if语句的顺序是如何保持一致的。以上代码,输出:

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4), (1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

将推导式的[]改成()即可得到生成器:

squares = (x**2 for x in range(10))
print(type(squares))

以上代码,输出:

<class 'generator'>

列表推导式的第一个表达式可以是任何表达式,包括另外一个列表推导式,我们叫这种情况为嵌套的列表推导式。实例:

# 3×4矩阵的示例,其被实现为长度为4的3个列表的列表
matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],
]# 下面的列表推导式将转置行和列
res = [[row[i] for row in matrix] for i in range(4)]print(res)

以上代码,输出:

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

嵌套的列表推导式在它后面的for上下文中求值,所以这个例子等效于:

# 3×4矩阵的示例,其被实现为长度为4的3个列表的列表
matrix = [[1, 2, 3, 4],[5, 6, 7, 8],[9, 10, 11, 12],
]# 下面的列表推导式将转置行和列
transposed = []
for i in range(4):transposed.append([row[i] for row in matrix])print(transposed)

思考:求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元组列表,下面给出代码但请尽可能先自己写出来:

res = [(x, y) for x in range(5) if x % 2 == 0 for y in range(5) if y % 2 == 1]
print(res)

View Code

2、字典推导式

字典和集合推导式是该思想的延续,语法差不多,只不过产生的是集合和字典而已。其基本格式如下:

{ key_expr: value_expr for value in collection if condition }

实例,快速更换key和value:

data = {'a': 10, 'b': 34, 'c':100}
res = {v: k for k, v in data.items()}
print(res)

以上代码,输出:

{10: 'a', 34: 'b', 100: 'c'}

3、集合推导式

集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:

{ expr for value in collection if condition }

实例:

squared = {x**2 for x in [1, 1, 2]}
print(squared)

以上代码,输出:

{1, 4}

转载于:https://www.cnblogs.com/mrbug/p/8419808.html

python3 第二十五章 - comprehensions(推导式)相关推荐

  1. 鸟哥的Linux私房菜(基础篇)- 第二十五章、 Linux 备份策略

    第二十五章. Linux备份策略 最近升级日期:2009/09/18 万一不幸你的 Linux 被黑客入侵了.或是你的 Linux 系统由於硬件关系 (不论是天灾还是人祸) 而挂掉了!这个时候,请问如 ...

  2. 游戏设计的艺术:一本透镜的书——第二十五章 好的游戏是通过游戏测试做出来的

    这是一本游戏设计方面的好书 转自天之虹的博客:http://blog.sina.com.cn/jackiechueng 感谢天之虹的无私奉献 Word版可到本人的资源中下载 第二十五章好的游戏是通过游 ...

  3. 【正点原子STM32连载】 第二十五章 TFTLCD(MCU屏)实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

  4. 【正点原子STM32连载】 第二十五章 TFT-LCD(MCU屏)实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

    1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420 3)全套实验源码+手册+视 ...

  5. 第二十五章补充内容 3 assert()宏

    //第二十五章补充内容 3 assert()宏 //有的编译器还提供了assert()宏,这个宏在许多书中被翻译为断言,它的作用是当assert()的参数为真时,返回真,假如参数值为假,那么它将执行某 ...

  6. 25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验

    1)资料下载:点击资料即可下载 2)对正点原子Linux感兴趣的同学可以加群讨论:935446741 3)关注正点原子公众号,获取最新资料更新 第二十五章RTC实时时钟实验 实时时钟是很常用的一个外设 ...

  7. 第二十五章补充内容 5 不能为0的变量

    // 第二十五章补充内容 5 不能为0的变量 /*#define DEBUG #include <iostream> #include <string> using names ...

  8. 第二十五章:重新吃上饭的李恪

    第二十五章:重新吃上饭的李恪 可能李丽质永远都不会忘记了自己饿肚子饿了很久以来的第一顿饭吧. 吃的非常的香,吃完这顿饭以后,李丽质开始也参与到了洗皮衣的过程中,不过由于他个子比较小,所以只能做一些简单 ...

  9. 现实迷途 第二十五章 重见故人

    第二十五章 重见故人 注:原创作品,请尊重原作者,未经同意,请勿转载,否则追究责任. 两天后,狗子又变得生龙活虎了,他决定要和江北不醉无归. "你想斋喝,还是荤喝?"电话中狗子问江 ...

最新文章

  1. Linux内核的各个组成部分,Linux 内核的组成部分
  2. ASP.NET的软件开发规范_转载
  3. C++ 读取结束的判断
  4. 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性...
  5. python用于数据处理真的那么强大嘛_为什么有那么多人选择Python,真的有那么好吗?...
  6. 【BZOJ 1052】 1052: [HAOI2007]覆盖问题 (乱搞)
  7. npoi操作word书签_word进阶小教程,小研全部都给你!
  8. vb2008 获取mac地址_华为 荣耀路由Pro 设置MAC地址克隆的方法?华为荣耀路由器怎么设置...
  9. js上传文件到OSS
  10. 最全的搜索引擎入口和分类目录入口
  11. #655 – 冒泡事件可能会被某些控件屏蔽(Bubbling Mouse Events Swallowed by Some Controls)
  12. 阿里入局,通义千问备受期待
  13. 多个图片合并为一个压缩包下载
  14. 【职场攻略】职场社交之三大巧言攻略
  15. Google Earth Engine(GEE)——GEE版本的全球森林火灾信息获取并呈现2001-2020年四川省火灾亮度时间序列分析
  16. 让大数据落地的正确姿势
  17. 淘宝商品价格定向爬虫
  18. 真实地图最短路径规划(A*算法)
  19. 佳能Canon PIXMA iP4700 series 打印机驱动
  20. 我是如何用单机实现亿级规模题库去重的?

热门文章

  1. 启动和停止一个服务,修改服务的启动类型 Start and Stop Service for windows
  2. JAVA在线编译,无需环境变量
  3. Web前端JavaScript笔记(7)ECMA6新增数组方法
  4. linux磁盘写保护怎么修改_linux – mount:无法重新安装块设备/ dev / sda5读写,是写保护的...
  5. 快速更新android sd卡,Android 动态加载sd卡的jar文件实现更新jar方法
  6. php 打印 wap,PHP 输出简单动态WAP页面
  7. 合作开发过程产生的专利_合作开发合同(二)
  8. 10 tf.data模块
  9. 萌宠NFT将于4月16日正式上线
  10. Hashmasks将其艺术品与IPFS固定激励一起存储至Arweave中