• <<Python基础教程>>学习笔记 | 第04章 | 字典


    第04章:字典 当索引不好用时

    Python唯一的内建的映射类型,无序,但都存储在一个特定的键中。键能够使字符。数字。或者是元祖.

    ------

    字典使用:

    • 表征游戏棋盘的状态,每一个键都是由坐标值组成的元祖
    • 存储文件改动的次数,文件名称作为键
    • 数字电话/地址薄
    • 函数传递值def func(x,*args,**args):

    假设要建公司员工与座机号的列表,假设要获得Alice的座机仅仅能这么找

    >>> names   = ['Alice','Bob','Tom']
    >>> numbers = ['1234','7890','2356']
    >>> numbers[names.index('Alice')]
    '1234'

    真正有用的是phonebook['Alice']='1234', 这里就用到字典

    ------

    字典创建及使用

    >>> phonebooks = {'Alice':'1234','Bob':'7890','Tom':'2356'}

    • Alice为键,'1234'为值
    • 一对键/值为一项.
    • 项与项之间用分隔,键值之间用:分隔
    • 键值唯一。值能够反复
    • {} 空字典

    dict函数:

    能够通过dict函数,由其它键/值或其它字典来创建字典,比方以下:
    >>> items = [('name','Gumby'),('age',42)]
    >>> d1= dict(items)
    >>> d1
    {'age': 42, 'name': 'Gumby'}
    >>> d1['name']
    'Gumby'
    也能够通过keyword參数来创建字典,这是字典最实用的功能。在函数中非常实用:
    >>> d = dict(name='Sherry',age=35)
    >>> d
    {'age': 35, 'name': 'Sherry'}
    ------

    基本字典操作:

    >>> len(d)            #求字典中项的个数,也就是键/值对的值
    2
    >>> d['name']         #返回关联到键上的值
    'Sherry'
    >>> d['name']='Jerry' #将值关联到键上d[k]=v
    >>> d
    {'age': 35, 'name': 'Jerry'}
    >>> del d['name']     #删除键为值的项del d[k]
    >>> d
    {'age': 35}
    >>> 'age' in d
    True


    字典与列表的一些重要差别:

    • 字典中的键数据类型,能够使整型,否点型,字符型,或字典型
    • 字典赋值,能够给空字典赋值,即超过索引外赋值,这点是列表不具备的
    • k in d:查找的是键 v in l: 查找的是值(查找效率字典比列表高效,数据越多,效果越明显)

    第一点:字典中的键能够为不论什么不可变的类型,这是字典最强大的功能。适用范围非常广:
    第二点:相同非常重要,比方说,字典能够在空字典中建。列表就不行:

    >>> x = []
    >>> x[42]='Jerry' #将'Jerry'放到42号位置
    Traceback (most recent call last):
      File "<pyshell#41>", line 1, in <module>
        x[42]='Jerry'
    IndexError: list assignment index out of range
    >>> x = {}
    >>> x[42]='Jerry'
    >>> x
    {42: 'Jerry'}
    假设真要在42号关联'Jerry'值的话。必须用None来初始化,比方说:
    >>> x=[None]*43
    >>> x[42]='Jerry'
    >>> x
    [None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'Jerry']
    #电话本的脚本程序
    #!/usr/bin/env python
    #Filename:phonebook.py
    people={
    'Alice':{'phone':'7890','addr':'street 7890'},
    'Jerry':{'phone':'1234','addr':'street 1234'},
    'Wendy':{'phone':'5678','addr':'street 5678'}
    }
    
    
    labels={
    'phone':'phone number',
    'addr':'address'
    }
    
    
    name    = raw_input('Enter 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])
    字典的格式化字符串:(键),假设键在字典中存在,那么就能打印出来,这一功能在模板系统中很实用
    >>> phonebook={'Alice':'6102','Jerry':'7438','Wendy':'8215'}
    >>> print "Wendy's phone number is %(Wendy)s" % phonebook
    Wendy's phone number is 8215
    以HTML为样例
    >>> 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 home page!'}
    >>> print template % data
    <html>
    <head><title>My Home Page</title></head>
    <body>
    <h1>My Home Page</h1>
    <p>Welcome to my home page!</p>
    </body>
    </html>
    Note: String.Template 类对于此种情形也是很实用的!

    ------

    字典方法:
    clear

    >>> d={}
    >>> d['name']='Alice'
    >>> d['age'] = 30
    >>> d
    {'age': 30, 'name': 'Alice'}
    >>> return_value = d.clear()
    >>> d
    {}
    >>> return_value
    None
    注意以下两种情形:
    情形一:

    >>> x = {}
    >>> y = x
    >>> x['key'] = 'value'
    >>> y
    {'key': 'value'}
    >>> x
    {'key': 'value'}
    >>> x = {}
    >>> x
    {}
    >>> y
    {'key': 'value'}
    情形二:
    >>> x = {}
    >>> y = x
    >>> x['key'] = 'value'
    >>> x
    {'key': 'value'}
    >>> x;y
    {'key': 'value'}
    {'key': 'value'}
    >>> x.clear()
    >>> x;y
    {}
    {}
    假设想清空字典原始数据。就必须用clear()方法

    ------

    copy:

    浅拷贝:copy返回键/值一样的数据。但不是副本

    >>> x = {'user':'admin','machines':['host1','host2','host3']}
    >>> y = x.copy()
    >>> y
    {'user': 'admin', 'machines': ['host1', 'host2', 'host3']}
    >>> y['user']='root'
    >>> del y['machines'][2]
    >>> y
    {'user': 'root', 'machines': ['host1', 'host2']}
    >>> x
    {'user': 'admin', 'machines': ['host1', 'host2']}
    能够看出y仅仅是改动的话。原始x不变。但假设删元素的话,x也会变化,假设要改变上述情况,就要用到深拷贝
    深拷贝: 键/值一样,并且是副本
    >>> d = {}
    >>> d['name']=['Sherry','Jerry']
    >>> c = d.copy()
    >>> dc= deepcopy(d)
    >>> d['name'].append('Alice')
    >>> c
    {'name': ['Sherry', 'Jerry', 'Alice']}
    >>> dc
    {'name': ['Sherry', 'Jerry']}
    
    fromkeys:

    使用给定的键建立新的字典

    #方法一:
    >>> {}.fromkeys(['name','age'])
    {'age': None, 'name': None}
    #方法二:使用dict模块的fromkeys函数
    >>> dict.fromkeys(['name','age'])
    {'age': None, 'name': None}
    #假设不想使用默认的None,能够自己定义,比方说unknown
    >>> dict.fromkeys(['name','age'],'unknown')
    {'age': 'unknown', 'name': 'unknown'}
    get:更宽松的訪问字典
    #一般的方法訪问字典会报错
    >>> d={}
    >>> print d['name']
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    KeyError: 'name'
    #假设用get的话,返回为空,这在程序中比較实用
    >>> print d.get('name')
    None
    #还能够自己定义返回的结果,比方说N/A.没查询到的话就会返回
    >>> print d.get('name','N/A')
    N/A
    #假设有值的话,就能查询到
    >>> d={'name':'Jerry'}
    >>> d.get('name')
    'Jerry'
    #使用get函数的技巧的脚本
    [root@host]# cat phone.py
    #!/usr/bin/env python
    #Filename: phone.py
    people={
    'Alice':{'phone':'3102','addr':'Street 3102'},
    'Jerry':{'phone':'8125','addr':'Street 8125'},
    'Wendy':{'phone':'6501','addr':'Street 6501'}
    }
    #print的时候要用
    labels={
    'phone':'phone number',
    'addr' :'address'
    }
    
    name    = raw_input('Enter name:')
    request = raw_input('Phone number(p) or address(a):')
    
    key = request
    if request == 'p':  key='phone'
    if request == 'a':  key='addr'
    
    person = people.get(name,{})
    label  = labels.get(key,key)
    result = person.get(key,'Not Available')
    
    print "%s's %s is %s" % (name,label,result)
    输出结果:

    [root@host]# ./phone.py
    Enter name:Alice
    Phone number(p) or address(a):p
    Alice's phone number is 3102
    [root@host]# ./phone.py
    Enter name:Jerry
    Phone number(p) or address(a):papa
    Jerry's papa is Not Available
    能够看出,在get方法在程序中。即使是没有准备的值。也能做出合适的反应

    ------

    has_key  类似于k in d,检查字典中是否有给定的键. 

    >>> d={}
    >>> d.has_key('name')
    False
    >>> d['name']='John'
    >>> d.has_key('name')
    True
    Note: Python 3.0中不包含此函数

    ------

    itemsiteritems

    >>> d = {'title':'Python web page','url':'http://www.python.org','spam':0}
    >>> d.items()        #返回一个无序列表
    [('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python web page')]
    >>> d.iteritems()    #返回的是一个迭代对象
    <dictionary-itemiterator object at 0x2b1b153d4d80>
    >>> l= d.iteritems() #用list函数将迭代对象转为列表
    >>> list(l)       
    [('url', 'http://www.python.org'), ('spam', 0), ('title', 'Python web page')]
    Note: iteritems函数效率更高些

    ------

    pop: 用来获得给定键的值,而且将其删除

    >>> d = {'x':1,'y':2,'z':3}
    >>> d.pop()  #注意不能为空。这个要个列表差别开来
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: pop expected at least 1 arguments, got 0
    >>> d.pop('x')
    1
    >>> d
    {'y': 2, 'z': 3}
    ------

    popitem():  弹出最后一项。这个类似于列表中的pop()方法,但由于字典是无序的。

    若想一个个移除并处理项,这种方法就很实用,由于不须要获取键的值

    >>> d = {'title':'Python web page','url':'http://www.python.org','spam':0}
    >>> d.popitem()
    ('url', 'http://www.python.org')
    >>> d
    {'spam': 0, 'title': 'Python web page'}
    ------

    setdefault:类似于get

    >>> d = {}   #假设空值的话。setdefault有效
    >>> d.setdefault('name','N/A')
    'N/A'
    >>> d
    {'name': 'N/A'}
    >>> d = {'name':'Jerry'} #假设本身有值的话,setdefault不生效
    >>> d.setdefault('name','N/A')
    'Jerry'
    >>> d
    {'name': 'Jerry'}
    ------

    valuesitervalues

    values:以列表的方式返回字典中的值
    itervalues:返回迭代的对象
    >>> d={}
    >>> d[1]=1
    >>> d[2]=2
    >>> d[3]=3
    >>> d[4]=4
    >>> d.values()
    [1, 2, 3, 4]
    >>> d.itervalues()
    <dictionary-valueiterator object at 0x2ae67d732030>
    >>> l=d.itervalues()
    >>> list(l)
    [1, 2, 3, 4]
    ------

    update:能够用一个字典去更新还有一个字典

    >>> d = {
    ... 'title':'Python Web Page',
    ... 'url':'http://www.python.org',
    ... 'changed':'Mar 14 22:09:05 GMT 2014'
    ... }
    >>> x = {'title':'Python Language Page'}
    >>> d.update(x)
    >>> d
    {'url': 'http://www.python.org', 'changed': 'Mar 14 22:09:05 GMT 2014', 'title': 'Python Language Page'}
    ------

    本章函数:

    dict(seq)      用(键/值)对(或者映射和keyword參数)建立字典

  • 相关阅读:
    站立会议11(冲刺二)
    站立会议10(冲刺二)
    站立会议09(冲刺二)
    站立会议08(冲刺二)
    每日站立会议(一)
    四则运算--单元测试
    四则运算安卓版
    返回二维数组最大联通子数组的和
    团队项目成员和题目
    第五周学习进度
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6817666.html
Copyright © 2020-2023  润新知