defaultdictとnamedtupleの使用(python)


defaultdictとnamedtupleの使用
defaultdict()とnamedtuple()はcollectionsモジュールの2つの実用的な拡張タイプです.1つはdictシステム内蔵タイプから継承され、1つはtupleシステム内蔵タイプから継承されます.拡張と同時にクールな特性が追加され、特定の場面で実用的です.
定義および役割は、dictionaryと同様のオブジェクトを返します.dictとは異なり、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 "", line 1, in 
    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)