列表推导和字典推导是Python中非常Python化的知识。本博客将为您详细解答列表理解和字典派生的相关技术知识。ListComprehension列表推导可以利用列表、元组、字典、集合等数据类型,快速生成满足特定需求的列表。语法格式如下:[expressionforiterationvariableiniterableobject[ifconditionalexpression]]ifconditionalexpression是可选的,学习了列表推导后可以发现它是for循环的变体语句,比如我们现有要求列表中的所有元素都变成原始值的两倍。for循环写my_list=[1,2,3]new_list=[]foriinmy_list:new_list.append(i*2)print(new_list)列表理解写nn_list=[i*2foriinmy_list]print(nn_list)就是比较for循环语句,加一个[],但是需要注意的是,列表推导每得到一个结果,最终都会形成一个新的列表。看列表理解语法形成nn_list=[i*2foriinmy_list],for关键字后面是一个普通的循环,前面的表达式i*2其中i是for循环中的变量,也就是说表达式可以使用for循环的后续迭代生成的变量。理解了内容列表的推导就已经掌握了90%的内容,剩下的就是熟练度的问题了。将if语句包含到代码中并运行后,你也可以掌握基本功了。if语句是判断,其中i也是上一次循环产生的迭代变量。nn_list=[i*2foriinmy_listifi>1]print(nn_list)这些是通用技巧,列表推导可以支持两层for循环,例如下面的代码:nn_list=[(x,y)forxinrange(3)foryinrange(3)]print(nn_list)当然,如果你想加密(没有人能看懂你的代码)你的代码,你可以无限嵌套娃娃,而列表理解不会限制循环的层数,多层循环是一层层嵌套,可以展开一个三层的list推导,你就会理解nn_list=[(x,y,z,m)forxinrange(3)foryinrange(3)forzinrange(3)forminrange(3)]print(nn_list)当然,在多层列表推导中,还是支持if语句的,生成的变量if之后可以使用之前的所有迭代,但不建议超过20%,这将大大降低代码的可读性。当然,如果你想让你的代码更难读,下面的写法是正确的。nn_list=[(x,y,z,m)forxinrange(3)ifx>1foryinrange(3)ify>1forzinrange(3)forminrange(3)]打印(nn_list)nn_list=[(x,y,z,m)forxinrange(3)foryinrange(3)forzinrange(3)forminrange(3)ifx>1andy>1]print(nn_list)nn_list=[(x,y,z,m)forxinrange(3)foryinrange(3)forzinrange(3)forminrange(3)ifx>1ify>1]print(nn_list)现在你对列表理解有了更直观的概念。listcomprehension对应的英文是listcomprehension。有的地方写成列表推导式。从它的最终结果来看,它是一个创建列表的A语法,而且是一个非常简洁的语法。两种不同的写法,一定要比较效率。经测试,小数据范围影响不大。当循环次数达到千万级时,就有些区别了。importtimedefdemo1():new_list=[]foriinrange(10000000):new_list.append(i*2)defdemo2():new_list=[i*2foriinrange(10000000)]s_time=time.perf_counter()demo2()e_time=time.perf_counter()print("Coderunningtime:",e_time-s_time)运行结果:#for循环代码运行时间:1.3431036140000001#listcomprehension代码运行时间:0.9749278849999999listcomprehensioninPython3表达式具有局部作用域,表达式中的变量和赋值只能在局部起作用。表达式上下文中的同名变量也可以正常引用,局部变量不会对其产生影响。所以不会有变量泄露的问题。例如下面的代码:x=6my_var=[x*2forxinrange(3)]print(my_var)print(x)列表理解也支持嵌套。参考代码如下,只有想不到,没有不可能。my_var=[y*4foryin[x*2forxinrange(3)]]print(my_var)字典理解有了列表理解的概念,字典理解学习起来非常简单,语法格式如下:{key:valueforiterativevariableiniterableobject[ifconditionalexpression]}只看案例my_dict={key:valueforkeyinrange(3)forvalueinrange(2)}print(my_dict)得到结果如下:{0:1,1:1,2:1}这时候需要注意的是字典中不能出现同名的key。第二次出现会覆盖第一次的值,所以得到的值全是1。最常见的where就是下面的代码,遍历一个有键值关系的可迭代对象。my_tuple_list=[('name','eraser'),('age',18),('class','no1'),('like','python')]my_dict={key:key的值,valueinmy_tuple_list}print(my_dict)元组推导和集合推导其实大家应该能猜到Python中有这两种推导,相信大家已经掌握了语法。但是,虽然语法相似,但是元组推导的结果却不同,如下。my_tuple=(iforiinrange(10))print(my_tuple)运行后结果:
