Python中Collection的使用小技巧
本文所述实例来自独立软件开发者AlexMarandon,在他的博客中曾介绍了数个关于PythonCollection的实用小技巧,在此与大家分享。供大家学习借鉴之用。具体如下:
1.判断一个list是否为空
传统的方式:
iflen(mylist): #Dosomethingwithmylist else: #Thelistisempty
由于一个空list本身等同于False,所以可以直接:
ifmylist: #Dosomethingwithmylist else: #Thelistisempty
2.遍历list的同时获取索引
传统的方式:
i=0 forelementinmylist: #Dosomethingwithiandelement i+=1
这样更简洁些:
fori,elementinenumerate(mylist): #Dosomethingwithiandelement pass
3.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方法,作用如其字面含义。
4.在Dictionary中元素分组
和上面类似,先创建Persons:
classPerson(object): def__init__(self,age): self.age=age persons=[Person(age)foragein(78,14,78,42,14)]
如果现在我们要按照年龄分组的话,一种方法是使用in操作符:
persons_by_age={} forpersoninpersons: age=person.age ifageinpersons_by_age: persons_by_age[age].append(person) else: persons_by_age[age]=[person] assertlen(persons_by_age[78])==2
相比较之下,使用collections模块中defaultdict方法的途径可读性更好:
fromcollectionsimportdefaultdict persons_by_age=defaultdict(list) forpersoninpersons: persons_by_age[person.age].append(person)
defaultdict将会利用接受的参数为每个不存在的key创建对应的值,这里我们传递的是list,所以它将为每个key创建一个list类型的值。
本文示例仅为程序框架,具体功能还需要读者根据自身应用环境加以完善。希望本文所述实例对大家学习Python能起到一定的帮助作用。