Python入门基础第十课--字典

    1.前言

    通过前面的章节我们可以知道,列表这种数据结构是将值组织到一个结构中,并且通过编号去引用它的值。强大的Python难道只有这一种引用方式吗?答案是否定的,在这章我们将介绍一个新的引用方式--字典,字典是Python里面唯一内建的映射类型,字典里面的值没有特殊的顺序,但是都存储在一个特定的键(key)底下。键的范围很广,包括:数字、字符串、元组。

    字典的创建,一方面是为了让我们轻松查找某个特定的键,从而获得对应的值。另一方面是为了让我们能够快速地得到特定键的位置。很方便,很强大。

    2.字典的创建和使用

    2.1 创建字典

  • 直接创建
>>> phonebook={'Alice':'1234','Benth':'5678','Cecil':'9999'}
>>> phonebook
{'Alice': '1234', 'Benth': '5678', 'Cecil': '9999'}

    仔细看上面的例子,像这种直接创建字典的方法,我们要记住字典里面键和值对应的格式。在这里,键是名字,值是电话号码。对应的键和值之间用冒号来分隔,不同的键值对用逗号来分隔,整体的用花括号括起来,表示一个完整的字典。将创建好的字典在shell里面打印出来以后,你会看到格式很整齐,很规整。

  • dict函数
>>> phonenumbers=[('name','Alice'),('numbers','12345678')]
>>> p=dict(phonenumbers)
>>> p
{'name': 'Alice', 'numbers': '12345678'}    
>>> p=dict(name='Alice',numbers='123456789')
>>> p
{'numbers': '123456789', 'name': 'Alice'}

    还记得我们前面说过的list函数吗?它和这里的dict函数一样,也是类型,而不是具体的函数,我们得牢记这一点。

    2.2基本字典操作

    字典的行为在很多方面与序列类似,回头看看我们前面序列里面说过的操作方法:

  • len(d):返回d中键-值对的数量。
  • d[k]返回关联到键k上的值。
  • d[k]=v将值v关联到键k上。
  • del d[k]删除键为k的键值对。
  • k in d 检查d中是否有关于k键的键值对,检查成员资格。   

    来看一个字典的入门例子:

people={
    'Alice':{
        'phone': '2341',
        'addr': 'Foo drive 23'
    },

    'Benth':{
        'phone': '9102',
        'addr': 'Bar street 42'
    },

    'Ceil': {
        '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])
/usr/local/bin/python2.7 /Users/yangjiayuan/PycharmProjects/day/day03/dirctory.py
Name: Ceil
Phone number (p) or address (a)?a
Ceil's address is Baz avenue 90. 

Process finished with exit code 0

    看一看上面的代码自己理解一下,看的过程中注意以下两点:

  1. 键是任意不可变类型
  2. 当我们尝试在列表里面尝试将一个值关联到一个空列表的某个位置上,会报错。这显然是不可能的,因为这个位置根本不存在,为了可以成功操作,我们必须采用这样的操作:[None]*number来将其初始化,而不能使用[]。但是我们可以将一个值关联到一个空字典里面,而不会发生任何错误。来看看。
>>> p=[]
>>> p[10]='Alice'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> x={}
>>> x[42]='Alice'
>>> x
{42: 'Alice'}

    这个例子,值得深思!

    3.字典方法

    对比我们前面学过的列表,和其他的内建类型一样,字典也有方法。这些方法非常有用,但是可能不会像列表或者字符串方法那样频繁被使用,在这里,我会挑一些常用的方法来给出一些具体的例子。假如你以后使用的方法不在下面叙述的这些里面,你可以参考自己的资料或者再查询,得到相关方法的使用。

  • clear方法
    clear方法用于清除字典中的所有项。这个是原地操作,所有没有返回值。 
>>> d={}
>>> d['name']='Alice'
>>> d['number']='22'
>>> d
{'name': 'Alice', 'number': '22'}
>>> returne_value=d.clear()
>>> d
{}
>>> print returne_value
None

    为什么首先要讲这个方法呢?这不就是清除一个字典里面的项吗?还有什么用,我们继续看:

>>> x={}
>>> y=x
>>> x['key']='value'
>>> y
{'key': 'value'}
>>> x={}
>>> y
{'key': 'value'}

     再看:

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

    在上面两个例子,x和y最初对应于同一个字典,我们通过将x关联到一个空的字典来"清除"它,这对y一点影响都没有,y还是关联到原来的字典。但是用来clear方法以后,原始字典里面的元素被清除了,从而y也变成空的了。

  • copy方法

    copy方法返回一个具有相同键-值对的新字典。来看看。

>>> x={'hostname':'youzi','ipaddress':'192.168.999.999','username':'yangjiayuan'}
>>> x
{'username': 'yangjiayuan', 'hostname': 'youzi', 'ipaddress': '192.168.999.999'}
>>> y=x.copy()
>>> y
{'username': 'yangjiayuan', 'hostname': 'youzi', 'ipaddress': '192.168.999.999'}
>>> y['username']='wangchao'
>>> y
{'username': 'wangchao', 'hostname': 'youzi', 'ipaddress': '192.168.999.999'}
>>> x
{'username': 'yangjiayuan', 'hostname': 'youzi', 'ipaddress': '192.168.999.999'}

    可以看到,当在副本中替换值得时候,原始字典不受影响,但是如果修改了某个值(原地修改,而不是替换),原始字典也会改变,因为同样的值也存储在原字典中。

    避免上述描述的问题的措施是采用深复制,复制包含的所有值。可以使用copy模块的deepcopy函数来完成这个操作。来看看:

>>> from copy import deepcopy
>>> d={}
>>> d['names']=['Alice','Benth']
>>> c=d.copy()
>>> dc=deepcopy(d)
>>> d['names'].append('Clive')
>>> c
{'names': ['Alice', 'Benth', 'Clive']}
>>> dc
{'names': ['Alice', 'Benth']}
  • get方法

    get方法是个更宽松的访问字典的方法,一般来说,如果试图访问字典中不存在的项时会出错。    

>>> d={}
>>> print d['name']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'name'
>>> print d.get('name')
None
>>> d['name']='Alice'
>>> print d.get('name')
Alice

    其他的方法嘞,都是用到的时候才去看它的介绍的,一般情况下用的很少,掌握上面三个就可以了,下面给出上面一个入门代码的升级版本,利用get方法去访问”数据库“实体。

people={
    'Alice':{
        'phone': '2341',
        'addr': 'Foo drive 23'
    },

    'Benth':{
        'phone': '9102',
        'addr': 'Bar street 42'
    },

    'Ceil': {
        '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

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 )

    对比上面的代码,自己再看看,主要是代码的后半部分,好好理解下。

    关于字典这部分就说这么多咯,是一个蛮重要的概念,希望引起大家的关注和重视。下一章节预告--条件、循环和其他语句。

猜你喜欢

转载自blog.csdn.net/qq_34454366/article/details/80212943