跟老齐学Python之再深点,更懂list
list解析
先看下面的例子,这个例子是想得到1到9的每个整数的平方,并且将结果放在list中打印出来
>>>power2=[] >>>foriinrange(1,10): ...power2.append(i*i) ... >>>power2 [1,4,9,16,25,36,49,64,81]
python有一个非常有意思的功能,就是list解析,就是这样的:
>>>squares=[x**2forxinrange(1,10)] >>>squares [1,4,9,16,25,36,49,64,81]
看到这个结果,看官还不惊叹吗?这就是python,追求简洁优雅的python!
其官方文档中有这样一段描述,道出了list解析的真谛:
Listcomprehensionsprovideaconcisewaytocreatelists.Commonapplicationsaretomakenewlistswhereeachelementistheresultofsomeoperationsappliedtoeachmemberofanothersequenceoriterable,ortocreateasubsequenceofthoseelementsthatsatisfyacertaincondition.
还记得前面一讲中的那个问题吗?
找出100以内的能够被3整除的正整数。
我们用的方法是:
aliquot=[] forninrange(1,100): ifn%3==0: aliquot.append(n) printaliquot
好了。现在用list解析重写,会是这样的:
>>>aliquot=[nforninrange(1,100)ifn%3==0] >>>aliquot [3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99]
震撼了。绝对牛X!
其实,不仅仅对数字组成的list,所有的都可以如此操作。请在平复了激动的心之后,默默地看下面的代码,感悟一下list解析的魅力。
>>>mybag=['glass','apple','greenleaf']#有的前面有空格,有的后面有空格 >>>[one.strip()foroneinmybag]#去掉元素前后的空格 ['glass','apple','greenleaf'] enumerate
这是一个有意思的内置函数,本来我们可以通过foriinrange(len(list))的方式得到一个list的每个元素编号,然后在用list[i]的方式得到该元素。如果要同时得到元素编号和元素怎么办?就是这样了:
>>>foriinrange(len(week)): ...printweek[i]+'is'+str(i)#注意,i是int类型,如果和前面的用+连接,必须是str类型 ... mondayis0 sundayis1 fridayis2
python中提供了一个内置函数enumerate,能够实现类似的功能
>>>for(i,day)inenumerate(week): ...printday+'is'+str(i) ... mondayis0 sundayis1 fridayis2
算是一个有意思的内置函数了,主要是提供一个简单快捷的方法。
官方文档是这么说的:
Returnanenumerateobject.sequencemustbeasequence,aniterator,orsomeotherobjectwhichsupportsiteration.Thenext()methodoftheiteratorreturnedbyenumerate()returnsatuplecontainingacount(fromstartwhichdefaultsto0)andthevaluesobtainedfromiteratingoversequence:
顺便抄录几个例子,供看官欣赏,最好实验一下。
>>>seasons=['Spring','Summer','Fall','Winter'] >>>list(enumerate(seasons)) [(0,'Spring'),(1,'Summer'),(2,'Fall'),(3,'Winter')] >>>list(enumerate(seasons,start=1)) [(1,'Spring'),(2,'Summer'),(3,'Fall'),(4,'Winter')]
在这里有类似(0,'Spring')这样的东西,这是另外一种数据类型,待后面详解。