defaultdict 和 namedtuple 的使用(python)

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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章