-
2020-09-23 19:06:53
列表表达式
a_range = range(10) # 对a_range执行for表达式 a_list = [x * x for x in a_range] # a_list集合包含10个元素 print(a_list) # 嵌套生成 e_list = [[x, y, z] for x in range(5) for y in range(4) for z in range(6)] # e_list列表包含120个元素 print(e_list)
元祖表达式
a = (x for x in range(1,10)) print(a) <generator object <genexpr> at 0x0000020BAD136620> print(tuple(a)) (1, 2, 3, 4, 5, 6, 7, 8, 9)
字典表达式
olddict={'C语言中文网': 6, 'c.biancheng.net': 15} newdict = {v: k for k, v in olddict.items() if v>10} print(newdict)
集合表达式
tupledemo = (1,1,2,3,4,5,6,6) setnew = {x**2 for x in tupledemo if x%2==0} print(setnew)
更多相关内容 -
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
2020-09-19 21:41:07主要介绍了Python推导式,结合简单实例形式分析了Python列表推导式、字典推导式与集合推导式基本使用方法,需要的朋友可以参考下 -
Python推导式详解,带你写出比较精简酷炫的代码
2020-12-21 10:42:28Python推导式详解,带你写出比较精简酷炫的代码前言1.推导式分类与用法1.1 列表推导1.2 集合推导1.3 字典推导1.4 元组推导?不存在的2.推导式的性能2.1 列表推导式与循环的性能2.2 列表推导式与生成器推导式的性能 ... -
Python列表推导式、字典推导式与集合推导式用法实例分析
2020-12-23 16:50:18本文实例讲述了Python列表推导式、字典推导式与集合推导式用法。分享给大家供大家参考,具体如下: 推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据... -
python列表推导式操作解析
2020-09-18 09:38:13主要介绍了python列表推导式操作解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
python 推导式(列表推导式、元组推导式、字 典推导式和集合推导式)以及zip 函数及用法(带示例)
2021-11-16 19:27:25python 推导式(列表推导式、元组推导式、字 典推导式和集合推导式)以及zip 函数及用法(带示例)一、推导式1.概念2.Python 列表推导式Python 元组推导式Python 字典推导式二、zip 函数及用法1.概念2.用法 一、推导...python 推导式(列表推导式、元组推导式、字 典推导式和集合推导式)以及zip 函数及用法(带示例)
一、推导式
概念
推导式(又称解析器),是 Python 独有的一种特性。使用推导式可以快速生成列表、元组、字典以及集合类型的数据,因此推导式又可细分为列表推导式、元组推导式、字典推导式以及集合推导式。
Python 列表推导式
列表推导式可以利用 range 区间、元组、列表、字典和集合等数据类型,快速生成一个满足指定需求的列表。
列表推导式的语法格式如下:[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] ]
此格式中,[if 条件表达式] 不是必须的,可以使用,也可以省略。
等价于:
for 迭代变量 in 可迭代对象 表达式
示例:
#实现要求计算0~9每个元素得的平方值,然后放到列表里面 #方法一 a1 = [x**2 for x in range(10)] print("a1:",a1) #等价于 #方法二 a2 = [] for x in range(10): a2.append(x**2) print("a2:",a2) #可以在列表推导式中添加 if 条件语句 #方法一 a3 = [x**2 for x in range(10) if x%2==0] print("a3:",a3) #等价于 #方法二 a4 = [] for x in range(10): if(x%2==0): a4.append(x**2) print("a4:",a4)
运行结果是一致的。
同时推导式也支持多个循环(循环嵌套)#实现嵌套循环 b1 = [(x,y) for x in range(2) for y in range(3)] print("b1:",b1) b2 = [] for x in range(2): for y in range(3): b2.append((x,y)) print("b2:",b2)
Python 元组推导式
元组推导式的语法格式如下:
(表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] )
其中,用 [] 括起来的部分,可以使用,也可以省略。
a = (x for x in range(1,10)) print(a)
从上面的执行结果可以看出,使用元组推导式生成的结果并不是一个元组,而是一个生成器对象
生成器:
生成器本质上也是迭代器,以 list 容器为例,在使用该容器迭代一组数据时,必须事先将所有数据存储到容器中,才能开始迭代;而生成器却不同,它可以实现在迭代的同时生成元素。(也就是说,对于可以用某种算法推算得到的多个数据,生成器并不会一次性生成它们,而是什么时候需要,才什么时候生成。)如果我们想要使用元组推导式获得新元组或新元组中的元素,有以下三种方式:
①使用 tuple() 函数,可以直接将生成器对象转换成元组,例如:
a = (x for x in range(1,10)) print(tuple(a))
② 直接使用 for 循环遍历生成器对象,可以获得各个元素,例如:a = (x for x in range(1,10)) for i in a: print(i,end=" ")
③使用 next() 方法遍历生成器对象,也可以获得各个元素,例如:a = (x for x in range(3)) print(a.__next__()) print(a.__next__()) print(a.__next__()) print("转换后的元组",tuple(a))
注意,无论是使用 for 循环遍历生成器对象,还是使用 next() 方法遍历生成器对象,遍历后原生成器对象将不复存在,这就是遍历后转换原生成器对象却得到空元组的原因。Python 字典推导式
Python 中,使用字典推导式可以借助列表、元组、字典、集合以及 range 区间,快速生成符合需求的字典。
字典推导式的语法格式如下:
{表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]}
其中,用 [] 括起来的部分,可以使用,也可以省略。
可以看到,和其它推导式的语法格式相比,唯一不同在于,字典推导式用的是大括号{}。#交换现有字典中各键值对的键和值。 old_dict = {"Tom":24,"Amy":16} new_dict = {v:k for k,v in old_dict.items()} print(new_dict)
Python 集合推导式
Python 中,使用集合推导式可以借助列表、元组、字典、集合以及 range 区间,快速生成符合需求的集合。
集合推导式的语法格式和字典推导式完全相同,如下所示:{ 表达式 for 迭代变量 in 可迭代对象 [if 条件表达式] }
其中,用 [] 括起来的部分,可以使用,也可以省略。
集合推导式和字典推导式的格式完全相同,那么给定一个类似的推导式,如何判断是哪种推导式呢?最简单直接的方式,就是根据表达式进行判断,如果表达式以键值对(key:value)的形式,则证明此推导式是字典推导式;反之,则是集合推导式。
既然生成的是集合,那么其保存的元素必须是唯一的。
tupledemo = (1,1,2,3,4,5,6,6) new = {x**2 for x in tupledemo if x%2==0} print(new)
二、zip 函数及用法
1.概念
zip() 函数是 Python 内置函数之一,它可以将多个序列(列表、元组、字典、集合、字符串以及 range() 区间构成的列表)“压缩”成一个 zip 对象。
所谓“压缩”,其实就是将这些序列中对应位置的元素重新组合,生成一个个新的元组。zip() 函数的语法格式为:
zip(iterable, …)
其中 iterable,… 表示多个列表、元组、字典、集合、字符串,甚至还可以为 range() 区间。2.用法
my_list = [1,2,3] my_tuple = (4,5,6) print([x for x in zip(my_list,my_tuple)]) my_dict = {"Name":"Tom",\ "Sex":"boy",\ "Age":24} print({x for x in zip(my_dict)}) my_str1 = "Hello" my_str2 = "Hi" print([x for x in zip(my_str1,my_str2)])
在使用 zip() 函数“压缩”多个序列时,它会分别取各序
列中第 1 个元素、第 2 个元素、… 第 n 个元素,各自组成新的元组。需要注意的是,当多个序列中元素个数不一致时,会以最短的序列为准进行压缩。另外,对于 zip() 函数返回的 zip 对象,既可以像上面程序那样,通过遍历提取其存储的元组,也可以向下面程序这样,通过调用 list() 函数将 zip() 对象强制转换成列表:
my_list = [1,2,3] my_tuple = (4,5,6) print(list(x for x in zip(my_list,my_tuple)))
-
Python进阶系列:细讲Python推导式
2021-02-09 09:23:57前言由于Python的良好生态,很多时候我们的程序只是通过调用别人写好的方法即可实现功能。...本文重点学习推导式推导式的优缺点如何合理使用推导式推导式可能的进化本文字数2000+,适合已入门Python...前言
由于Python的良好生态,很多时候我们的程序只是通过调用别人写好的方法即可实现功能。
不过,很多时候我们还是需要处理序列。不管是入门中还是早已入门的小伙伴,对于处理序列毫无疑问会选择用for循环。
在Python中还有一种更高效更简洁的处理序列方式——推导式。本文详细探讨关于推导式的细节。
本文重点学习推导式
推导式的优缺点
如何合理使用推导式
推导式可能的进化
本文字数2000+,适合已入门Python和希望水平有所提升的小伙伴。
原创不容易,请点击右上方关注按钮,多多支持~
for循环有啥不好,非要学推导式?
我们来看一个例子,如何把一个数值列表中大于0的数值筛选出来。下图给出for循环的做法
可以看到for循环还是妥妥地把问题解决,代码并不复杂。 分析代码与原问题的表达对应关系:行5,表达从数值列表取出数值。
行6,表达'大于0的数值筛选出来'
但原问题没有提及到创建一个用于保存结果的列表和如何把结果加入结果列表。
上面的代码中的行4与行7,都是多余的动作。
是时候让推导式出场了
上图是一种比较'官方'的写法,把整个推导式写到一行里,我更喜欢下图的写法。
这就是列表推导式,很简单吧。看起来其实与之前的for循环写法差不多。但推导式有以下好处。不需要像for循环那样,先定义一个列表,然后在循环中编写如何把结果放入列表的代码。
表达更为清晰了,推导式的每个部分都与原问题的表达一一对应。
行15,表达了 我要把什么样的东西放入结果中,这里只有一个n,表示符合要求的数值。
行16与行17与之前for循环分析是一致。注意看,这里不再需要写冒号了。
推导式的外面用一个[]包围着,表示结果是一个列表。
推导式的性能更好。在序列的数据量不大的情况下推导式的性能优势不会太明显,如果序列的元素数量成千上万,那么推导式比for形式性能通常优胜2倍以上。
通过对比学习推导式
觉得怎么样,推导式是不是语义表达好的同时性能又高呢。下面通过与for循环形式对比来学习推导式的写法。 图中左边是for循环,右边是推导式
红框部分表示遍历序列,可以看到两者形式一样,但注意,推导式不需要在最后写冒号
同样地,上图红框表示如何判断每个元素,这里表示过滤的条件。
我们可以写各种各样复杂的判断条件。
上图红框是推导式最后一部分,他决定了输出结果
比如说,如果希望每个输出值是原来的两倍,我们就可以写 n*2
结果可以是各种各样的类型,比如红框部分如果写 f'值:{n}',那么结果就是一系列的字符串。
更进一步
我们来看一个稍微复杂点的例子。 假设我们有多个文件,每个文件都有多行数值(都是整数),行数不确定。如图:
现在需要把多个这样的文件的所有数值拿出来,然后把小于50的数值筛选出来作为结果,并且标注每个数值的来源文件。 下图是基本数据的定义
方法 get_nums_from_file 不是这里的重点,我们只需要知道,给他一个文本路径,他会读取文件中的每行的整数,以返回一个整数列表
这个问题可以描述为'列表中的元素还可以提取出一个列表',这样的情况下同样可以用推导式。如下:
其实与普通的for循环嵌套是差不多的套路
行38,首先遍历paths列表
行39,在上一个循环中获取文件中的整数列表再次遍历这个整数列表
行40,对应原问题的筛选条件。
行37,这里可以使用下方两个for的变量f和n,因此可以轻而易举找到每个数值的来源
有时候不应该强行使用推导式我们很容易犯的一个错误是,手上拿着一个锤子,看啥都认为是钉子,更何况拿着的是一个雷神之锤。
推导式简洁又高效的好处,很容易让人着迷于使用他来解决一切的集合处理问题。我们接着上面的需求来说明。 现在需求不仅仅过滤小于50的数值,而是取出'小于所在文件的所有数值的平均',并且结果需要显示该文件的平均值。 下面是推导式的解决方法:
推导式最大的问题在于无法在过程中建立临时变量
这个需求下,由于没法用临时变量保存一个文件的平均值,因此导致多次求平均,不仅代码结构混乱,而且效率还很低。
这时候老老实实使用for循环是个很好的选择。如下:
未来,推导式可能的进化
Python的推导式其实来源于函数式编程中的思想,目前市面上的几门面向对象编程语言都加入了相关方面的语法,未来Python的推导式可能会参考他们从而改进自身的推导式语法。如图为C#的Linq,特点是他允许在过程中定义临时变量。
可以看到,如果Python的推导式加入这样的语法功能,那么本文说的推导式的缺点就不再出现。Python的推导式在未来的进化值得期待。
小结在处理序列时,推导式是一个高效简洁的方式
当需求需要在循环中创建各种临时的状态数据时,推导式就不再适合处理。建议考虑使用for循环。
在Python中,推导式很多时候被当作是否熟悉Python的标志之一,同时推导式也存在许多争议,我们应该清楚了解推导式再谈如何应用,毕竟任何技术都必需在适当的地方才能发挥最大的作用。
本文示例的代码:https://github.com/CrystalWindSnake/Creative/tree/master/python/comprehensions
你已经学会了推导式了吗?觉得使用for循环还是推导式比较好呢?
如果觉得本文对你有所帮助,记得关注、评论、转发、收藏噢~
私信我'python',即可获得按水平领域分类好的Python资料,还会不定期更新有用的Python技巧。
-
Python推导式-最全用法
2021-01-11 15:11:191、Pythonic - 很Python 写一段代码生成1到100之间的数字...正确的写法是使用Python的推导式: nums = [i * i for i in range(1, 101)] 2、带条件的推导式 生成一个列表,包含1到100之间是3的倍数的数字的方法: 9, 31、Pythonic - 很Python
写一段代码生成1到100之间的数字的平方的列表,答案是:
1,4,9,16...
如果你这样写,你就不Pythonic了:
nums = [] for i in range(1, 101): nums.append(i * i) print(nums)
正确的写法是使用Python的推导式:
nums = [i * i for i in range(1, 101)]
2、带条件的推导式
生成一个列表,包含1到100之间是3的倍数的数字的方法:
9, 36, 81...
代码:
nums = [i * i for i in range(1, 101) if i % 3 == 0]
3、带条件的表达式
生成一个列表,如果是3的倍数就用平方,否则就用是数字本身:
1, 2, 9, 4, 5, 36...
代码:
nums = [i * i if i % 3 == 0 else i for i in range(1, 101)]
结合上面的3个例子,来看一下推导式总结:
- 推导式从一个可枚举数据(列表,元组,集合,字典等)推导出一个列表。也可以推导出生成器,集合或字典。
- 推导式可以加推导条件,只对符合条件的元素推导
- 要推导出的元素使用表达式生成,可以用if else生成不同元素
[表达式 if 表达式条件 else 分支 for i in 序列 if 推导条件]
4、使用函数
如果推导条件或者表达式特别复杂怎么办?可以使用函数。
推导所有1-100之间的所有质数:2,3,5,7…def is_prime(num): if num == 1: return False for i in range(2, num): if (num % i) == 0: return False else: return True p_nums = [i for i in range(1, 100) if is_prime(i)] print(p_nums)
把推导的条件放在函数中,既可以应对复杂的条件,又可以利用推导式的简洁写法。
同理,如果生成推导结果的过程很复杂,也可以把逻辑放到函数中。
推导1900到2021年之间所有的年份,标记出闰年,生成结果:1900, 1901, 1902, 1903, '闰1904'
代码:
def is_run(year): if (year % 4) == 0: if (year % 100) == 0: if (year % 400) == 0: return True # 整百年能被400整除的是闰年 else: return False else: return True # 非整百年能被4整除的为闰年 else: return False ryears = [f'闰{y}' if is_run(y) else y for y in range(1900, 2021)] print(ryears)
5、嵌套表达式 - 不推荐使用
从2000年到2021年,生成每个月份:‘2000年:1月’, ‘2000年:2月’, ‘2020年:3月’, …, ‘2021年:12月’
monthes = [f'{y}年:{m}月' for y in range(2000, 2022) for m in range(1,13) ]
这里有两个for循环,类似于:
monthes = [] for y in range(2000, 2022): for m in range(1,13): monthes.append(f'{y}年:{m}月')
是不是下面的特别容易懂?所以两层的循环不推荐使用推导式,哈哈。
那我为什么还要讲?你会碰到有人这么写,知道它的存在还是有点必要的。6、推导巨大的列表 - 不要这么干!
推导出1到100亿之间的数字的平方,代码如下:
nums = [i * i for i in range(1, 10000000000)]
但是这段代码很可能会卡死你的电脑,除非你的电脑是超级计算机。因为它要在内存中做100亿次计算,然后保存这100亿个数字。
7、使用生成器
这种情况下,我们应该使用推导生成器,用法很简单:
- 把方括号改成圆括号就可以了
nums = (i * i for i in range(1, 10000000000)) print(nums) print(next(nums)) print(next(nums)) print(next(nums))
打印出来是一个生成器:
<generator object <genexpr> at 0x7fa0b422feb0> 1 4 9
这是一个生成器,它不会一次性生成100亿个数字,只有调用next()的时候,它才会生成一个新的,返回给你。也就是说,同一个时间,只保存一个数字。
8、推导字典
推导字典的方式和推导列表很相似,只不过:
- 使用大括号
- 使用键值对
推导一个包含数字和数字平方组成的字典,结果是这样的:
{1: 1, 2: 4, 3: 9, ..., 100: 10000}
代码:
nums_dict = {n:n*n for n in range(1,101)} print(nums_dict)
反过来,平方在前面,数字在后面:
nums_dict = {n*n:n for n in range(1,101)} print(nums_dict)
给下面的字典按照分数排序:
{‘张三’:59, ‘李四’:87, ‘王五’:78, ‘赵六’:100, ‘刘七’:90}
排序结果:
{‘赵六’: 100, ‘刘七’: 90, ‘李四’: 87, ‘王五’: 78, ‘张三’: 59}
代码:
scores = {'张三':59, '李四':87, '王五':78, '赵六':100, '刘七':90} sored_scores = {item[0]:item[1] for item in sorted(scores.items(), key=lambda item:item[1], reverse=True)} print(sored_scores)
- 先把字典scores变成一个元组列表:scores.items()
- 用sorted函数给元组列表排序:sorted(scores.items(), key=lambda item:item[1],
reverse=True) - 排序过程用lambda指定使用元组的第二列排序:key=lambda item:item[1]。默认是是第一列。
- 指定倒着排序,也就是分数高的在前面:reverse=True
- 使用推导式,把排好序的元组列表,生成一个新的排好序的字典:{item[0]:item[1] for item in … }
9、推导集合Set
推导集合的方式和列表是一样的,区别在于:
- 使用大括号,类似于推导字典,但它是单个元素,而不是键值对。
- 集合会自动过滤掉重复的元素。
下面的名字列表,去掉前后空格后去掉重复的名字:
[ ‘麦叔’, ‘张三’, ’ 麦叔 ', 'NBA ‘, ‘张小三’, ‘NBA’, ‘石石’, ’ 莫名’, ‘莫名’ ]
推导结果:
{‘石石’, ‘NAB’, ‘张小三’, ‘莫名’, ‘张三’, ‘麦叔’}
代码:
names = [ '麦叔', '张三', ' 麦叔 ', 'NBA ', '张小三', 'NBA', '石石', ' 莫名', '莫名' ] new_names = {n.strip() for n in names} print(new_names)
-
Python列表推导式与生成器表达式用法示例
2020-09-20 19:37:43主要介绍了Python列表推导式与生成器表达式用法,简单描述了Python列表推导式与生成器表达式的概念、功能,并结合具体实例形式分析了Python列表推导式与生成器表达式简单使用技巧,需要的朋友可以参考下 -
python 推导式练习题
2021-08-11 16:52:491、通过列表推导式完成下面数据类型转换。 将 ["{‘a’:11,‘b’:2}", “[11,22,33,44]”] 转换为以下格式: li1 = [{‘a’: 11, ‘b’: 2}, [11, 22, 33, 44]] li1 = [eval(i) for i in li1] print(li1) 运行结果... -
Python推导式
2022-05-05 20:21:58Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。 Python 支持各种数据结构的推导式: 列表(list)推导式 字典(dict)推导式 集合(set)推导式 元组(tuple)推导式 ... -
Python推导式的五种写法
2021-01-12 14:42:11推导式,也叫解析式,是Python的一种独有特性。 总共有五种推导式: 1.列表(list)推导式 列表推导式的基本格式 new_list = [expression for_loop_expression if condition] 举个例子。 我想找出一个数值列表... -
python推导式、迭代器、生成器
2022-04-07 23:07:30推导式与生成器 -
python推导式的用法
2021-02-25 21:05:35python推导式的用法前言一、列表推导式(List Comprehensions)二、字典推导式(Dictionary Comprehensions)三、集合推导式(Set Comprehensions)四、生成器推导式(Generator Comprehensions) 前言 推导式提供了更简洁... -
python推导式详解
2021-01-21 16:45:011、列表推导式 >>> number_list = [i for i in range(3)] >>> number_list [0, 1, 2] >>> number_list = [num - 1 for num in range(3)] >>> number_list [-1, 0, 1] >>> #创建偶数列表 ... list_a = [ i for i in ... -
Python小技巧之列表推导式到匿名函数
2020-12-21 22:08:13Python小技巧之列表推导式到匿名函数 最近又看了一遍python的基础知识,所谓温故而知新,哈哈哈,所以在这里写下自己的一些见解,我觉得在实战过程中还是非常有用的一些小技巧,也分享给大家,如果写的不好,请大家... -
Python 推导式和生成器
2021-02-21 16:21:41由于使用推导式会立刻创建对应大小的空间,假设列表推导式创建的新列表有一百万个元素,但我们实际上不会用到这么多元素,在这种情况下就会非常浪费空间。所以我们可以使用生成器,在其内置的循环中用到时不断推断出... -
Python 推导式(列表推导式,字典推导式,集合推导式)
2019-04-05 23:07:00Python的各种推导式 推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。 共有三种推导。 列表推导式 字典推导式 集合推导式 列表推导式 1... -
Python推导式(生成式)
2018-05-18 11:25:021、推导式 推导式是从一个或者多个迭代器快速简洁的创建数据结构的一种方法。可以将循环和条件判断相结合,从而避免语法冗长的代码。 2、列表推导式 常见的列表推导式有以下两种格式 [expression for item in ... -
python推导式赋值列表、字典、集合、元组
2021-03-05 21:52:32#----列表推导式[表达式 for item in 可迭代对象 if 条件]a=[i for i in range(1,50)]print(a)a=[i for i in range(1,400) if i**2%34.5 ==0]print(a)a = [(x,y) for x in range(3,6) for y in range(6,9)]print(a)#... -
python 推导式
2022-03-22 22:58:01python 推导式 -
Python创建推导式,理解推导式【详细】
2021-12-02 18:37:05与python中推导式相关的知识看这一篇就够啦. -
python推导式
2019-09-16 14:28:46文章目录1. 前言2. 列表推导式3. 字典推导式4. 集合推导式5. 总结6. 参考文献 1. 前言 2. 列表推导式 3. 字典推导式 4. 集合推导式 5. 总结 6. 参考文献