獨立軟體開發者 Alex Marandon 在他的部落格中介紹了數個關于 Python Collection 的實用小技巧,在此與諸位分享。
判斷一個 list 是否為空
傳統的方式:
if len(mylist):
# Do something with my list
else:
# The list is empty
由于一個空 list 本身等同于
False
,是以可以直接:
if mylist:
# Do something with my list
else:
# The list is empty
周遊 list 的同時擷取索引
傳統的方式:
i = 0
for element in mylist:
# Do something with i and element
i += 1
這樣更簡潔些:
for i, element in enumerate(mylist):
# Do something with i and element
pass
list 排序
在包含某元素的清單中依據某個屬性排序是一個很常見的操作。例如這裡我們先建立一個包含 person 的 list:
class Person(object):
def __init__(self, age):
self.age = age
persons = [Person(age) for age in (14, 78, 42)]
傳統的方式是:
def get_sort_key(element):
return element.age
for element in sorted(persons, key=get_sort_key):
print "Age:", element.age
更加簡潔、可讀性更好的方法是使用 Python 标準庫中的
operator
子產品:
from operator import attrgetter
for element in sorted(persons, key=attrgetter('age')):
print "Age:", element.age
attrgetter
方法優先傳回讀取的屬性值作為參數傳遞給
sorted
方法。
operator
子產品還包括
itemgetter
和
methodcaller
方法,作用如其字面含義。
在 Dictionary 中元素分組
和上面類似,先建立 Persons:
class Person(object):
def __init__(self, age):
self.age = age
persons = [Person(age) for age in (78, 14, 78, 42, 14)]
如果現在我們要按照年齡分組的話,一種方法是使用
in
操作符:
persons_by_age = {}
for person in persons:
age = person.age
if age in persons_by_age:
persons_by_age[age].append(person)
else:
persons_by_age[age] = [person]
assert len(persons_by_age[78]) == 2
相比較之下,使用
collections
子產品中
defaultdict
方法的途徑可讀性更好:
from collections import defaultdict
persons_by_age = defaultdict(list)
for person in persons:
persons_by_age[person.age].append(person)
defaultdict
将會利用接受的參數為每個不存在的 key 建立對應的值,這裡我們傳遞的是
list
,是以它将為每個 key 建立一個
list
類型的值。