推导式

推导式:comprehensions(又称解析式),是Python的一种独有特性,相当于语法糖的存在,推导式是可以从一个数据序列构建另一个新的数据序列的结构体。

共有三种推导,在Python2和3中都有支持:

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

列表推导式 randint

基本格式: 变量名 = [expression1 for variable in sequence[, if expression2]]

expression1 : 列表生成元素表达式,可以是有返回值的函数。

for variable in sequence : 迭代sequence将variable传入expression1。

if expresiion2 : 可选,根据条件过滤。

 

1.最基本的列表推导式

>>> arr = [i for i in range(5)]
>>> arr
[0, 1, 2, 3, 4]

2.附带运算的列表推导式

>>> arr = [i**2 for i in range(5)]
>>> arr
[0, 1, 4, 9, 16]
>>> arr = [pow(i, 2) for i in range(5)]
>>> arr
[0, 1, 4, 9, 16]
>>> arr = [pow(i, 2) if i%2==0 else -pow(i, 2) for i in range(5)]
>>> arr
[0, -1, 4, -9, 16]

3.附带条件的列表推导式

>>> arr = [i for i in range(10) if i < 5]
>>> arr
[0, 1, 2, 3, 4]

4.多重循环的列表推导式

>>> list_ = [[1, 2], [3, 4], [5, 6]]
>>> arr = [i for sub_list in list_ for i in sub_list]
>>> arr
[1, 2, 3, 4, 5, 6]
>>> arr = [x+y for x in range(5) for y in range(2)]
>>> arr
[0, 1, 1, 2, 2, 3, 3, 4, 4, 5]
# 0 1 2 3 4
# 0 1 0 1 0 1 0 1 0 1
# 0 1 1 2 2 3 3 4 4 5

5.更多用法

>>> dict_ = {'P':'y', 't':'h', 'o':'n'}
>>> arr = [k+v for k,v in dict_.items()]
>>> arr
['Py', 'th', 'on']
>>> from random import randint
>>> arr = [randint(1, 5) for i in range(5)]
>>> arr
[3, 2, 3, 2, 1]

集合推导式

与列表推导式差不多一样,只不过是将[ ]换为{ }

set_ = {x+y for x in range(5) for y in range(3)}
>>> set_
{0, 1, 2, 3, 4, 5, 6}
>>> set_ = {k+v for k,v in dict_.items()}
>>> set_
{'on', 'Py', 'th'}

字典推导式

变量名 = {表达式 for 临时变量 in 可迭代内容}

 

>>> new_dict = {i:pow(i, 2) for i in range(5)}
>>> new_dict
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
>>> new_dict = {x:'Python'.index(x) for x in 'Python'}
>>> new_dict
{'P': 0, 'y': 1, 't': 2, 'h': 3, 'o': 4, 'n': 5}
>>>
>>> dict_ = {'P':'y', 't':'h', 'o':'n'}
>>> new_dict = {v:k for k,v in dict_.items()}
>>> new_dict
{'y': 'P', 'h': 't', 'n': 'o'}
>>> dict_ = {'a': 10, 'b': 20, 'A': 3, 'C': 7, 'd': 5, 'x': 2, 'X': 4, 'y': 8}
>>> new_dict = {k.upper(): dict_.get(k.lower(), 0) + dict_.get(k.upper(), 0) for k in dict_.keys() if k in 'aAbcDxy'}
>>> new_dict
{'A': 13, 'B': 20, 'X': 6, 'Y': 8}

为什么元组不可以用推导式

Python中,将( )用于了生成器,将列表推导式的[ ]改成( )即可得到生成器。

>>> gener = (i for i in range(5))
>>> type(gener)
<class 'generator'>
>>> gener
<generator object <genexpr> at 0x00000179ECB01BA0>
>>> [i for i in gener]
[0, 1, 2, 3, 4]
>>> [i for i in gener]
[]

不过可以通过类型强制性转换,将生成器转换为对应的类型数据

>>> gener = (i for i in range(5))
>>> list(gener)
[0, 1, 2, 3, 4]
>>> gener = (i for i in range(5))
>>> tuple(gener)
(0, 1, 2, 3, 4)
>>> gener = (i for i in range(5))
>>> set(gener)
{0, 1, 2, 3, 4}

Python—推导式的更多相关文章

  1. python推导式pythonic必备【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  2. python推导式pythonic必备

    编程规范 今天公司新出了一套Python编程规范2.0,一直觉得自己写代码路子有点野,所以仔细的看了下. 多数的内容在网上都能搜到,但有几点需要说说 让我觉得羞愧的注释率 公司要求代码注释行,占代码总 ...

  3. Python推导式详解,带你写出比较精简酷炫的代码

    Python推导式详解,带你写出比较精简酷炫的代码 前言 1.推导式分类与用法 1.1 列表推导 1.2 集合推导 1.3 字典推导 1.4 元组推导?不存在的 2.推导式的性能 2.1 列表推导式与 ...

  4. Python推导式

    Python推导式 推导式:是Python中提供的一个非常方便的功能,可以通过一行代码实现创建 list.dict.tuple.set的同时初始化一些值. 1.列表推到式 # -*- coding: ...

  5. python推导式与海象运算符

    背景:介绍两种python用于语句优化的用法 一.推导式 1.推导式简介: Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体. 支持:列表(list).元 ...

  6. python 推导式和迭代器、生成器

    1.常用推导式 推导式是从一个或者多个迭代器快速简洁创建数据结构的一种方法. 1.1 _ 列表推导式 最简单的形式:  [exprssion for item in iterable] 示例:  nu ...

  7. python 推导式

    推导式又称解析式,是Python的一种独有特性.目的是可以从一个数据序列推导出另一个数据序列,适用于python 的list ,dict 和集合 list中的推导式: _list=[i for i i ...

  8. Python 推导式、迭代器、生成器、模块和包

    一.推导式 (一).列表推导式(集合推导式也同理于此) 利用列表推导式,取出1-20内所有偶数 li = [i for i in range(1, 21) if i % 2 == 0] # 如果只有一 ...

  9. 奇技淫巧,还是正统功夫? - Python推导式最全用法

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

随机推荐

  1. Mint-ui全局引入

    1.Mint-ui在全局引入之后,在组件中使用其中的js函数,如toast() this.$toast('在全局引入之后可以直接在this.$toast中使用')

  2. CI框架注意

    1.在ci框架中,如果想继承自己写的控制器,从而不继承CI_Controller,可以在application/core中定义控制器,从而就可以在controllers中的控制器继承. 2.在ci框架 ...

  3. 【朝花夕拾】Android自定义View篇之(一)View绘制流程

    前言 转载请申明转自[https://www.cnblogs.com/andy-songwei/p/10955062.html]谢谢! 自定义View.多线程.网络,被认为是Android开发者必须牢 ...

  4. 【HDU - 3085】Nightmare Ⅱ(bfs)

    -->Nightmare Ⅱ 原题太复杂,直接简单的讲中文吧 Descriptions: X表示墙 .表示路 M,G表示两个人 Z表示鬼 M要去找G但是有两个鬼(Z)会阻碍他们,每一轮都是M和G ...

  5. eclipse中一个项目引用另一个项目,运行报:java.lang.NoClassDefFoundError

    项目右击-properties-Java Build Path -Porjects-add.选中了某个项目. 项目用tomcat启动时,报错:java.lang.NoClassDefFoundErro ...

  6. zeroMQ 4 java

    自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...

  7. Noip 2016 天天爱跑步 题解

    [NOIP2016]天天爱跑步 时间限制:2 s   内存限制:512 MB [题目描述] 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是 ...

  8. [NOIP2009]靶形数独 题解

    407. [NOIP2009] 靶形数独 时间限制:5 s   内存限制:128 MB [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低. ...

  9. javascript案例之放大镜效果

    效果图 如何实现该效果呢??   我们先来进行分析 实现思路 1.鼠标移入移出事件 1>移入:悬浮块和大图显示 2>移出:悬浮块和大图隐藏 2.鼠标移动(悬浮块随着鼠标移动) 1>获 ...

  10. 个人永久性免费-Excel催化剂功能第45波-逻辑判断函数增强

    自定义函数的最大的作用是可以按需定制,在Excel的原生函数不提供的场景时,传统方法需要使用大量的嵌套函数去实现,实在太累,今天Excel催化剂再次送上一波绝对十分常用的函数逻辑判断类函数给大家使用! ...