defaultdict 和 namedtuple 的使用
defaultdict()和namedtuple()是collections模塊裏面2個很實用的擴展類型。一個繼承自dict系統內置類型,一個繼承自tuple系統內置類型。在擴展的同時都添加了額外的很酷的特性,而且在特定的場合都很實用。
定義以及作用
返回一個和dictionary類似的對象,和dict不同主要體現在2個方面:
可以指定key對應的value的類型。
不必爲默認值擔心,換句話說就是不必擔心有key沒有value這回事。總會有默認的value.
d = defaultdict(list),該語句創建一個defaultdict類型(你可以想象爲dict類型),value的類型是list。通過對d_3的對比就能看到,defaultdict是可以直接就進行d[k]的操作,即使d此時還是一個空的字典。實際過程就是示例裏d_2的處理過程。
定義及作用
namedtuple是繼承自tuple的子類。namedtuple和tuple比,有更多更酷的特性。namedtuple創建一個和tuple類似的對象,而且對象擁有可以訪問的屬性。這對象更像帶有數據屬性的類,不過數據屬性是隻讀的。
#coding:utf-8
from collections import namedtuple
from pprint import pformat #這個庫的效果是使格式化和print更美觀(每行更容易看)
class Node(namedtuple('Node','pointData left right label')): #用Node來表示樹的結構
#pointData是自己的值,left爲左子樹,right爲右子樹,label爲該數據的類別
def __repr__(self): #使對於類Node的print會先用pformat進行美觀格式化
return pformat(tuple(self))
node = Node(10, None, None, 1)
# node = Node(pointData=10, left=None, right= None, label = 1)
# print node
from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
d = defaultdict(list)
for k, v in s:
d[k].append(v)
d['red'] = [('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
print defaultdict
print d.items(), d.keys()
# d_2 = {}
# for k, v in s:
# d_2.setdefault(k, []).append(v)
# print(list(d_2.items()))
# d_3 = {}
# for k, v in s:
# d_3[k].append(v)
# print(d_3.items())
f = dict()
1.把數據變成namedtuple類:
>>> TPoint = namedtuple('TPoint', ['x', 'y'])
>>> t = [11, 22]
>>> p = TPoint._make(t)
>>> p
TPoint(x=11, y=22)
>>>
2. 根據namedtuple創建的類生成的類示例,其數據是隻讀的,如果要進行更新需要調用方法_replace.
>>> p
TPoint(x=11, y=22)
>>> p.y
22
>>> p.y = 33
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
p.y = 33
AttributeError: can't set attribute
>>> p._replace(y=33)
TPoint(x=11, y=33)
>>>
3.將字典數據轉換成namedtuple類型。
>>> d = {'x': 44, 'y': 55}
>>> dp = TPoint(**d)
>>> dp
TPoint(x=44, y=55)
>>>
namedtuple最常用還是出現在處理來csv或者數據庫返回的數據上。利用map()函數和namedtuple建立類型的_make()方法。
>>> d = {'x': 44, 'y': 55}
>>> dp = TPoint(**d)
>>> dp
TPoint(x=44, y=55)
>>>
# sqlite數據庫
import sqlite3
conn = sqlite3.connect('/companydata')
cursor = conn.cursor()
cursor.execute('SELECT name, age, title, department, paygrade FROM employees')
for emp in map(EmployeeRecord._make, cursor.fetchall()):
print(emp.name, emp.title)
# MySQL 數據庫
import mysql
from mysql import connector
from collections import namedtuple
user = 'herbert'
pwd = '######'
host = '127.0.0.1'
db = 'world'
cnx = mysql.connector.connect(user=user, password=pwd, host=host,database=db)
cur.execute("SELECT Name, CountryCode, District, Population FROM CITY where CountryCode = 'CHN' AND Population > 500000")
CityRecord = namedtuple('City', 'Name, Country, Dsitrict, Population')
for city in map(CityRecord._make, cur.fetchall()):
print(city.Name, city.Population)