python学習ノート5-第四章辞書

12337 ワード

第四章辞書
 
1.マップマップマップ:名前で値を参照するデータ構造で、辞書は唯一組み込まれたマッピングタイプです.要素、共通文字列、メタグループは、任意の可変オブジェクトを使用して識別できます.
key-value、文字列、メタグループ、数値
辞書の作成
>>>    
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'}

>>>  dict()    
>>> items = [('name', 'Gumby'), ('age', 42)]   #1
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}
>>> 
>>> d = dict(name='Gumby', age=42)   #2
>>> d
{'age': 42, 'name': 'Gumby'}
>>> 
>>> dict()   #   
{}

 
2.辞書操作
>>> d = {'age': 42, 'name': 'Gumby'}
>>> a = len(d)  #  
>>> a
2
>>> d['age']   #d[k]      k   
42
>>> d['no'] = '123' #d[k]=v,  v    k    


    





>>> d
{'age': 42, 'name': 'Gumby', 'no': '123'}
>>> del d['no']  #del d[k]     k  
>>> d
{'age': 42, 'name': 'Gumby'}
>>> 'age' in d  # k in d  d       k  ,        



                        #              ,                
 True

>>> x = []   #   
>>> x[42] = 'Foobar'  #              ,  ,  [None] * 43, x[42]='Foobar'  
Traceback (most recent call last):
  File "<pyshell#125>", line 1, in <module>
    x[42] = 'Foobar'  #              ,  
IndexError: list assignment index out of range

>>> x = {}  #   
>>> x[42] = 'Foobar'   #          
>>> x
{42: 'Foobar'}
 
完全な例
#     
#          ,             ,  'phone' 'addr'           

people = {
    'Alice':{
        'phone': '2341',
        'addr': 'Foo drive 23'
        },
    'Beth':{
        'phone': '9102',
        'addr': 'Bar street 42'
        },
    'Cecil':{
        'phone': '3158',
        'addr': 'Baz avenue 90'
        }
    }

#                 ,      
labels = {
    'phone': 'phone number',
    'addr': 'address'
    }

name = raw_input('Name: ')

#          ,       
request = raw_input("Phone number (p) or address (a)? ")
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'

#                 
if name in people: print "%s's %s is %s." %(name, labels[key], people[name][key])

#    
Name: Alice
Phone number (p) or address (a)? a
Alice's address is Foo drive 23.

 
3.辞書を使用した文字列のフォーマット
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'}
>>> "Ceil's phone number is %(Ceil)s." %phonebook   #          
"Ceil's phone number is 0123."

#  
>>> template = '''<html>
    <head><title>%(title)s</title></head>
    <body>
    <h1>%(title)s</h1>
    <p>%(text)s</p>
    </body>
</html>'''
>>> data = {'title': 'My Home Page', 'text': 'Welcome to my homepage!'}
>>> print template %data
<html>
    <head><title>My Home Page</title></head>
    <body>
    <h1>My Home Page</h1>
    <p>Welcome to my homepage!</p>
    </body>
</html>

 
4.辞書の方法
#(1)
>>> #clear()    ,         None
>>> # 1   clear()
>>> x = {}
>>> y = x    #x,y      
>>> x['key'] = 'value'  #    
>>> y
{'key': 'value'}
>>> x = {}   #x        ,      ,y        
>>> y
{'key': 'value'}

>>> # 2  clear()
>>> x = {}
>>> y = x
>>> x['key'] = 'value'
>>> y
{'key': 'value'}
>>> x.clear()  #  clear()       
>>> y
{}

#(2)
>>> #copy()   ,               ,    
>>> x = {'a': '1', 'b': ['2','3']}
>>> y = x.copy()
>>> y['a'] = '11'    #  
>>> y['b'].remove('2')   #  
>>> y
{'a': '11', 'b': ['3']}  #     ,  
>>> x 
{'a': '1', 'b': ['3']}  #       ,   

#(3)   
>>> #copy    deepcopy()
>>> from copy import deepcopy
>>> d = {}
>>> d['names'] = ['Alfred', 'Bertrand']  #    
>>> d
{'names': ['Alfred', 'Bertrand']}
>>> c = d.copy();                               #   
>>> dc = deepcopy(d)                       #   
>>> d['names'].append('Clive')          #      
>>> c
{'names': ['Alfred', 'Bertrand', 'Clive']}  #       
>>> dc
{'names': ['Alfred', 'Bertrand']}            #       

#(4)fromkeys
>>> #fromkeys            ,          None
>>> {}.fromkeys(['name', 'age'])
{'age': None, 'name': None}
>>> #  
>>> dict.fromkeys(['name', 'age'])
{'age': None, 'name': None}
>>> #       
>>> dict.fromkeys(['name', 'age'], 'Unknown')
{'age': 'Unknown', 'name': 'Unknown'}

#(5)get
>>> #           ,   ,   get  ,     
>>> d = {}
>>> print d['name']

Traceback (most recent call last):
  File "<pyshell#213>", line 1, in <module>
    print d['name']
KeyError: 'name'
>>> #  get    
>>> print d.get('name')
None
>>> #     
>>> d.get('name', 'N/A')
'N/A'
>>> #     ,get            
>>> d['name'] = 'Eric'
>>> d.get('name')
'Eric'

 
get()を使用した完全な例
#   get()      
people = {
    'Alice':{
        'phone': '2341',
        'addr': 'Foo drive 23'
        },
    'Beth':{
        'phone': '9102',
        'addr': 'Bar street 42'
        },
    'Cecil':{
        'phone': '3158',
        'addr': 'Baz avenue 90'
        }
    }

#                 ,      
labels = {
    'phone': 'phone number',
    'addr': 'address'
    }

name = raw_input('Name: ')

#          ,       
request = raw_input("Phone number (p) or address (a)? ")
key = request #    ,     'p'   'a'
if request == 'p': key = 'phone'
if request == 'a': key = 'addr'

#  get()     
person = people.get(name, {}) #    name   ,        person
label = labels.get(key, key)  #        p a,        label
result = person.get(key, 'not available') # key(        ),   notavailable

print "%s's %s is %s." %(name, label, result)

#    
>>> 
Name: sun
Phone number (p) or address (a)? a
sun's address is not available.
>>> ================================ RESTART ================================
>>> 
Name: Alice
Phone number (p) or address (a)? p
Alice's phone number is 2341.
>>> ================================ RESTART ================================
>>> 
Name: Alice
Phone number (p) or address (a)? test
Alice's test is not available. 

 
メソッド続き
#(1)items
>>> #items          
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'}
>>> phonebook.items()
[('Beth', '9102'), ('Alice', '2341'), ('Ceil', '0123')]

#(2)iteritems
>>> #iteritems           
>>> phonebook = {'Alice': '2341', 'Beth': '9102', 'Ceil': '0123'}
>>> it = phonebook.iteritems()
>>> it
<dictionary-itemiterator object at 0x01F145C0>
>>> list(it) # literator(   )  list
[('Beth', '9102'), ('Alice', '2341'), ('Ceil', '0123')]

#(3)pop()
>>> #pop()         ,        - 
>>> d = {'x':1, 'y':2}
>>> d.pop('x')
1                                        #   'x'   1,   1
>>> d                                 #  x--1     
{'y': 2}
>>> 
#(4)popitem()
>>> #popitem()       - 
>>> d = {'1': 'a', '2': 'b', '3': 'c'}
>>> d.popitem()                            #    1---a
('1', 'a')
>>> d                                            #   1---a
{'3': 'c', '2': 'b'}
>>> 

#(5)setdefault()   get  
>>> #setdefault()  get(),      ,         None,      
>>> d = {}
>>> print d.setdefault('name')  #     ,     None
None
>>> d.setdefault('name', 'N/A')
'N/A'
>>> d['name'] = 'Gumby'
>>> d.setdefault('name')
'Gumby'

#(6)update()
>>> #update()        ,     
>>> d = {'1': 'a', '2': 'b', '3': 'c'}
>>> x = {'3': 'cdef'}   
>>> d.update(x)                       # ‘3’  ,  ‘3’    
>>> d
{'1': 'a', '3': 'cdef', '2': 'b'}

>>> y = {'4': 'test'}                    # ‘4’   ,      
>>> d.update(y)
>>> d
{'1': 'a', '3': 'cdef', '2': 'b', '4': 'test'} 

#(7)values()
>>> #values()            ,         
>>> d = {}
>>> d[1] = 1
>>> d[2] = 2
>>> d[3] = 3
>>> d
{1: 1, 2: 2, 3: 3}
>>> d.values()
[1, 2, 3] 

 
まとめ:
dict