本文转载自公众号《读书芯》(ID:AI_Discovery)Web开发、科学计算,当然还有人工智能。无论你想用python做什么,都免不了要学习Python的数据结构、变量函数声明、条件语句、控制流等基本概念。一个重要的“Pythonic”特性是列表理解——一种创建列表的简洁方法,这让许多初学者感到困惑。听说过,但不知道是什么?没关系,本文提供入门级的Python列表理解学习。为了使它更直观,本文列出了关于列表推导式你应该知道的九件事,包括语法和各种用例。1.基本语法最基本的列表理解有以下语法。如前所述,它可以方便某些事情,例如创建列表。扩展形式通常表示为for循环,其中可迭代对象的每个项目都运行表达式中指定的某些操作。#listcomprehension[expressionforiteminiterable]#expandedformforiteminiterable:expression2。创建列表不用说,最流行的用法是简洁地创建列表。假设您不知道列表理解是什么,您可能会在创建列表时执行类似的操作。首先声明一个空列表。然后在for循环中,将每个项目追加到列表中。>>>pets=(bird,snake,dog,turtle,cat,hamster)>>>uppercased_pets=[]>>>forpetinpets:...uppercased_pets.append(pet.upper())...>>>uppercased_pets[BIRD,SNAKE,DOG,TURTLE,CAT,HAMSTER]查看由GitHub使用?托管的rawpets.py如基本语法部分所述,可以将for循环语句“压缩”为一行-也就是说,仅使用一行代码的列表理解,我们可以通过迭代原始列表来方便地创建列表。>>>pets=(bird,snake,dog,turtle,cat,hamster)>>>uppercased_pets=[pet.upper()forpetinpets]>>>uppercased_pets[BIRD,SNAKE,DOG,TURTLE,CAT,HAMSTER]3.过滤语句有时,在使用列表理解创建列表时,您不想包含现有列表中的所有项目。在这种情况下,就需要一个条件语句来过滤掉现有列表中不满足某个条件的项。相应的列表理解具有以下语法。#listcomprehensionwithaconditionalstatement[expressionforiteminiterableifsome_condition]#expandedformforiteminiterable:ifsome_condition:expressionviewrawlist.py由GitHub以?托管这是上述用法的示例:>>>primes=[2,3,5,7,11,13,17,19,23,29]>>>squared_primes=[x*xforxinprimesifx%10==3]>>>squared_primes[9,169,529]如果您有更复杂的条件评估,您甚至可以使用函数。>>>defhas_four_legs(宠物):...returnpetin(猪,狗,乌龟,仓鼠,猫)...>>>pets=(鸟,蛇,狗,乌龟,猫,仓鼠)>>>four_legs_pets=[pet.capitalize()forpetinpetsifhas_four_legs(pet)]>>>four_legs_pets[狗、乌龟、猫、仓鼠]查看rawhas_four_legs.py由GitHub4以?托管。条件分配有时,您不想从原始列表中过滤掉项目。相反,您想通过评估条件来确定要使用的表达式。下面给出语法及其用法,并相应地解释语法。#basicsyntax[expression0ifsome_conditionelseexpression1foriteminiterable]#syntaxexplained:comparedtothelistcomprehensionsbasicsyntax:[expressionforiteminiterable],我们想知道(expression0ifsome_conditionelseexpression1)是构成通用格式表达式的全部部分>>>max_value=10>>>numbers=(7,9,11,4,3,2,12)>>0=ceiling_s[numberifnumber<=max_valueelsemax_valuefornumberinnumbers]>>>ceiling_numbers0[7,9,10,4,3,2,10]>>>ceiling_numbers1=[(numberifnumber<=max_valueelsemax_value)fornumberinnumbers]>>>ceiling_numbers1[7,9,10,4,3,2,10]查看由GitHub5用?托管的rawsyntax.py。替换map()在某些情况下,您可能会看到人们使用map()来创建列表。具体来说,map()函数具有以下语法和其基本用法的示例。请注意,map()函数返回一个可迭代对象,因此您可以使用list()函数从该可迭代对象生成一个列表。#map()returnsaniteratorobjectmap(function,iterable)>>>pets=(bird,snake,dog,turtle,cat,hamster)>>>uppercased_pets=list(map(str.upper,pets))>>>uppercased_pets[BIRD,SNAKE,DOG,TURTLE,CAT,HAMSTER]查看由GitHub用?托管的rawmap.py如前所示,map()函数可以替换为列表理解。>>>pets=(bird,snake,dog,turtle,cat,hamster)>>>uppercased_pets=[pet.upper()forpetinpets]>>>uppercased_pets[BIRD,SNAKE,DOG,TURTLE,CAT,HAMSTER]6.嵌套列表理解来源:Pexels假设您在下面的代码片段中有一个元组,并且想要创建一个新的条目列表,使得条目是元组中所有数字的平方。在这种情况下,可以使用嵌套列表理解,其语法如下所示。#basicsyntaxofthenestedlistcomprehensions[expressionforsublistinouter_listforiteminsublist]#expandedformforsublistinouter_list:foriteminsublist:expression>>>nested_numbers=((1,4,7,8),(2,3,5))>>>squares=[x*xfornumbersinnested_numbersforxinnumbers]>>>正方形[1,16,49,64,4,9,25]查看由GitHub用?托管的rawnested.list.py虽然从技术上讲可以有多个级别的嵌套列表推导,但为了确保可读性,不建议在该级别以上设置两个。7.使用海象运算符Python3.8中的一个新特性是引入了海象运算符(:=),它用于赋值表达式。假设从字母列表中抽取十次,创建的列表将仅包括这些图中的元音。下面显示了如何在列表理解中使用海象运算符。具体来说,在下面的示例中,评估从字母表中随机抽取的一个字母,看它是否是元音,如果是,则将其分成列表理解表达式可访问的字母。>>>letters=list(thisistoproducealistofletters)>>>letters[t,h,i,s,,i,s,,t,o,,p,r,o,d,u,c,e,,a,,l,i,s,t,,o,f,,l,e,t,t,e,r,s]>>>importrandom>>>vowels=[letter.upper()for_inrange(0,10)if(letter:=random.choice(letters))inlist(aeoui)]>>>vowels[I,O,O,O,O]查看由GitHub8以?托管的rawletters.py。集合推导式虽然很多人都知道列表推导式,但是创建集合时也可以使用推导式。基本语法及其用法如下所示。一个主要区别是我们使用大括号而不是方括号。当然,按照设计,集合中的元素不能有重复项,而列表则允许重复项。请注意,条件语句也可以用于集合推导中。#syntaxforsetcomprehension{expressionforiteminiterable}>>>numbers=(1,34,5,8,10,12,3,90,70,70,90)>>>unique_even_numbers={numberfornumberinnumbersifnumber%2==0}>>>unique_even_numbers{34,70,8,10,12,90}查看由GitHub9使用?托管的rawset.comprehension.py。字典理解来源:Pexels知道列表和集合理解,Python也有字典理解也就不足为奇了。下面的代码片段显示了基本语法及其用法。#syntaxfordictcomprehension{key_expression:value_expressionforiteminiterable}>>>words=(python,is,a,big,snake)>>>len_words={word:len(word)forwordinwords}>>>len_words{python:6,is:2,a:1,big:3,snake:5}>>>len_words_p={word:len(word)forwordinwordsifword.startswith(p)}>>>len_words_p{python:6}查看rawdict.py由GitHub以?托管总结这文章回顾了列表理解的基本语法及其在各种场景中的用法。除了列表理解之外,还讨论了集合和字典理解。依靠这些理解有助于在Python中创建基本的集合数据类型,使它们更具可读性。
