Python Collection 小技巧
阿新 • • 發佈:2019-02-19
獨立軟體開發者 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
型別的值。