Python中list列表的一些进阶使用方法介绍
判断一个list是否为空
传统的方式:
iflen(mylist): #Dosomethingwithmylist else: #Thelistisempty
由于一个空list本身等同于False,所以可以直接:
ifmylist: #Dosomethingwithmylist else: #Thelistisempty
遍历list的同时获取索引
传统的方式:
i=0 forelementinmylist: #Dosomethingwithiandelement i+=1
这样更简洁些:
fori,elementinenumerate(mylist): #Dosomethingwithiandelement pass
list排序
在包含某元素的列表中依据某个属性排序是一个很常见的操作。例如这里我们先创建一个包含person的list:
classPerson(object): def__init__(self,age): self.age=age persons=[Person(age)foragein(14,78,42)]
传统的方式是:
defget_sort_key(element): returnelement.age forelementinsorted(persons,key=get_sort_key): print"Age:",element.age
更加简洁、可读性更好的方法是使用Python标准库中的operator模块:
fromoperatorimportattrgetter forelementinsorted(persons,key=attrgetter('age')): print"Age:",element.age
attrgetter方法优先返回读取的属性值作为参数传递给sorted方法。operator模块还包括itemgetter和methodcaller方法,作用如其字面含义。
list解析
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')]