列表推导式与字典推导式 在Python中推导式是一种非常Pythonic的知识,本篇博客将为你详细解答列表推导式与字典推导式相关的技术知识。列表推导式 列表推导式可以利用列表,元组,字典,集合等数据类型,快速的生成一个特定需要的列表。 语法格式如下:〔表达式for迭代变量in可迭代对象〔if条件表达式〕〕 if条件表达式非必选,学完列表推导式之后,你可以发现它就是for循环的一个变种语句,例如咱们现有一个需求是将一个列表中的所有元素都变成原值的2倍。 for循环写法mylist〔1,2,3〕newlist〔〕foriinmylist:newlist。append(i2)print(newlist) 列表推导式写法nnlist〔i2foriinmylist〕print(nnlist) 是不是对比看就是将for循环语句做了变形之后,增加了一个〔〕,不过需要注意的是,列表推导式最终会将得到的各个结果组成一个新的列表。 再看一下列表推导式语法构成nnlist〔i2foriinmylist〕,for关键字后面就是一个普通的循环,前面的表达式i2其中的i就是for循环中的变量,也就是说表达式可以用后面for循环迭代产生的变量,理解这个内容列表推导式就已经掌握9成内容了,剩下的是熟练度的问题。 在将if语句包含进代码中,运行之后,你也能掌握基本技巧,if语句是一个判断,其中i也是前面循环产生的迭代变量。nnlist〔i2foriinmylistifi1〕print(nnlist) 这些都是一般技能,列表推导式能支持两层for循环,例如下述代码:nnlist〔(x,y)forxinrange(3)foryinrange(3)〕print(nnlist) 当然如果你想加密(谁都看不懂你的代码)你的代码,你可以无限套娃下去,列表推导式并没有限制循环层数,多层循环就是一层一层的嵌套,你可以展开一个三层的列表推导式,就都明白了nnlist〔(x,y,z,m)forxinrange(3)foryinrange(3)forzinrange(3)forminrange(3)〕print(nnlist) 当然在多层列表推导式里面,依旧支持if语句,并且if后面可以用前面所有迭代产生的变量,不过不建议超过2成,超过之后会大幅度降低你代码的可阅读性。 当然如果你希望你代码更加难读,下面的写法都是正确的。nnlist〔(x,y,z,m)forxinrange(3)ifx1foryinrange(3)ify1forzinrange(3)forminrange(3)〕print(nnlist)nnlist〔(x,y,z,m)forxinrange(3)foryinrange(3)forzinrange(3)forminrange(3)ifx1andy1〕print(nnlist)nnlist〔(x,y,z,m)forxinrange(3)foryinrange(3)forzinrange(3)forminrange(3)ifx1ify1〕print(nnlist) 现在你已经对列表推导式有比较直观的概念了,列表推导式对应的英文是listcomprehension,有的地方写作列表解析式,基于它最后的结果,它是一种创建列表的语法,并且是很简洁的语法。 有了两种不同的写法,那咱们必须要对比一下效率,经测试小数据范围影响不大,当循环次数到千万级时候,出现了一些差异。importtimedefdemo1():newlist〔〕foriinrange(10000000):newlist。append(i2)defdemo2():newlist〔i2foriinrange(10000000)〕stimetime。perfcounter()demo2()etimetime。perfcounter()print(代码运行时间:,etimestime) 运行结果:for循环代码运行时间:1。3431036140000001列表推导式代码运行时间:0。9749278849999999 在Python3中列表推导式具备局部作用域,表达式内部的变量和赋值只在局部起作用,表达式的上下文里的同名变量还可以被正常引用,局部变量并不会影响到它们。所以其不会有变量泄漏的问题。例如下述代码:x6myvar〔x2forxinrange(3)〕print(myvar)print(x) 列表推导式还支持嵌套 参考代码如下,只有想不到,没有做不到的。myvar〔y4foryin〔x2forxinrange(3)〕〕print(myvar)字典推导式 有了列表推导式的概念,字典推导式学起来就非常简单了,语法格式如下:{键:值for迭代变量in可迭代对象〔if条件表达式〕} 直接看案例即可mydict{key:valueforkeyinrange(3)forvalueinrange(2)}print(mydict) 得到的结果如下:{0:1,1:1,2:1} 此时需要注意的是字典中不能出现同名的key,第二次出现就把第一个值覆盖掉了,所以得到的value都是1。 最常见的哪里还是下述的代码,遍历一个具有键值关系的可迭代对象。mytuplelist〔(name,橡皮擦),(age,18),(class,no1),(like,python)〕mydict{key:valueforkey,valueinmytuplelist}print(mydict)元组推导式与集合推导式 其实你应该能猜到,在Python中是具备这两种推导式的,而且语法相信你已经掌握了。不过语法虽然差不多,但是元组推导式运行结果却不同,具体如下。mytuple(iforiinrange(10))print(mytuple) 运行之后产生的结果:generatorobjectgenexprat0x0000000001DE45E8 使用元组推导式生成的结果并不是一个元组,而是一个生成器对象,需要特别注意下,这种写法在有的地方会把它叫做生成器语法,不叫做元组推导式。 集合推导式也有一个需要注意的地方,先看代码:myset{valueforvalueinHelloWorld}print(myset) 因为集合是无序且不重复的,所以会自动去掉重复的元素,并且每次运行显示的顺序不一样,使用的时候很容易晕掉。这篇博客的总结 这篇博客,我们学习了列表和字典推导式,掌握并熟练的应用二者之后,你Python技能又向前进了一步。