Python Collection 小技巧
獨立軟件開發者 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
類型的值。
原文:https://linuxtoy.org/archives/python-collection-tips.html