数据类型:字典

字典是一种无序的映射的集合,包含一系列的“键:值”对。字典常量用花括号表示,如{'name':'John','age':25,'sex':'male'}。其中,字符串name、age和sex为键,字符串John和male以及数字25为值。

1、字典的特点

字典具有下列主要特点

  • 字典的键通常采用字符串,但也可以用数字、元组等不可变的类型。
  • 字典值可以是任意类型。
  • 字典也可称为关联数组或散列表,它表示键映射到值。字典是无序的,他通过键来索引映射的值,而不是通过位置来索引。
  • 字典属于可变映射,通过索引来修改映射的值。
  • 字典长度可变,可为字典添加和删除“键:值”对。
  • 字典可以任意嵌套,即键映射的值可以是一个字典。
  • 字典存储的是对象的引用,而不是对象本身。

2、字典基本操作

字典基本操作包括创建字典、求长度、关系判断和索引等。

1.创建字典

可用多种方法来创建字典。例如:

>>> {}                                          #创建空字典
{}
>>> dict()                                      #创建空字典
{}
>>> {'name':'John','age':25,'sex':'male'}       #使用字典常量
{'age': 25, 'name': 'John', 'sex': 'male'}
>>> {'book':{'Python program':100,'C++ 入门':99}}#使用嵌套的字典
{'book': {'Python program': 100, 'C++ 入门': 99}}
>>> {1:'onw',2:'two'}                           #用数字作为键
{1: 'onw', 2: 'two'}
>>> {(1,3,5):10,(2,4,6):50}                     #用元组作为键
{(1, 3, 5): 10, (2, 4, 6): 50}
>>> dict(name='John',age=25)                    #使用赋值格式的键值对创建字典
{'age': 25, 'name': 'John'}
>>> dict([('name','John'),('age',25)])          #使用包含键元组和值元组的列表创建字典
{'age': 25, 'name': 'John'}
>>> dict.fromkeys(['name','age'])               #创建无映射值的字典,默认值为None
{'age': None, 'name': None}
>>> dict.fromkeys(['name','age'],0)             #创建值相同的字典
{'age': 0, 'name': 0}
>>> dict.fromkeys('abc')                        #使用字符串创建无映射值字典
{'b': None, 'a': None, 'c': None}
>>> dict.fromkeys('abc',10)                     #使用字符串和映射值创建字典
{'b': 10, 'a': 10, 'c': 10}
>>> dict(zip(['name','age'],['John',25]))       #使用zip解析键值列表创建字典
{'age': 25, 'name': 'John'}
>>> x={}                                        #先创建一个空字典
>>> x['name']='John'                            #通过赋值添加“键:值”对
>>> x['age']=25
>>> x
{'age': 25, 'name': 'John'}
>>>

2.求长度

len()函数可返回字典长度,即“键:值”对的个数。例如:

>>> x=dict(zip(['name','age'],['John',25]))
>>> len(x)
2

3.关系判断

in操作符可用于判断字典是否包含某个键。例如:

>>> x=dict(zip(['name','age'],['John',25]))
>>> 'name' in x
True
>>> 'sex' in x
False

4.索引

字典通过键来索引映射的值。例如:

>>> x={'book':{'Python编程':100,'C++入门':99},'publish':'人民邮电出版社'}
>>> x['boo']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'boo'
>>> x['book']
{'Python编程': 100, 'C++入门': 99}
>>> x['publish']
'人民邮电出版社'
>>> x['book']['Python编程']       #用两个键索引嵌套的字典
100

可通过索引修改映射值。例如:

>>> x=dict(name='John',age=25)
>>> x
{'age': 25, 'name': 'John'}
>>> x['age']=30                 #修改映射值
>>> x
{'age': 30, 'name': 'John'}
>>> x['phone']='17055233456'    #试图修改不存在的键的映射值时,添加“键:值”对
>>> x
{'age': 30, 'name': 'John', 'phone': '17055233456'}
>>>

也可以通过索引删除键值对。例如:

>>> x=dict(name='John',age=25)
>>> del x['name']       #删除键值对
>>> x
{'age': 25}

3、字典常用方法

Python为字典提供了一系列处理方法。

1.clear()

复制字典对象。例如:

>>> x=dict(name='John',age=25)
>>> x.clear()
>>> x
{}

2.copy()

复制字典对象。例如:

>>> x={'name':'John','age':25}
>>> y=x                 #直接赋值时,x和y引用同一个字典
>>> x,y
({'age': 25, 'name': 'John'}, {'age': 25, 'name': 'John'})
>>> y['name']='Curry'   #通过y修改字典
>>> x,y                 #显示结果相同
({'age': 25, 'name': 'Curry'}, {'age': 25, 'name': 'Curry'})
>>> y is x              #判断是否引用相同对象
True
>>> y=x.copy()          #y引用复制的字典
>>> y['name']='Python'  #修改y引用的字典映射值,此时不影响x的引用
>>> x,y
({'age': 25, 'name': 'Curry'}, {'age': 25, 'name': 'Python'})
>>> y is x              #判断是否引用相同对象
False

3.get(key[,default])

返回key映射的值。如果key不存在,返回空值。可用default参数指定不存在的键的返回值。例如:

>>> x={'name':'John','age':25}
>>> x.get('name')           #返回映射值
'John'
>>> x.get('sex')            #不存在的键返回值
>>> x.get('sex','xxx')      #不存在的键返回指定值
'xxx'
>>>

4.pop(key[,default])

从字典中删除键,并返回映射值。若键不存在,则返回default;未指定default参数时则会出错。例如:

>>> x={'name':'John','age':25}
>>> x.pop('name')                   #删除键并返回映射值
'John'
>>> x
{'age': 25}
>>> x.pop('sex','xxx')              #删除不存在的键
'xxx'
>>> x.pop('sex')                    #删除不存在的键,未指定default参数,出错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'sex'

5.popitem()

从字典删除并返回键值对元组。空字典调用该方法会产生KeyError错误。例如:

>>> x={'name':'John','age':25}
>>> x.popitem()         #删除并返回键值对元组
('age', 25)
>>> x                   #x中剩余一个键值对
{'name': 'John'}
>>> x.popitem() 
('name', 'John')
>>> x
{}
>>> x.popitem()         #空字典产生KeyError错误
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'popitem(): dictionary is empty'
>>>

6.setdefault(key[,default])

该方法用于返回映射值或者为字典添加键值对。指定键key在字典中存在时,返回映射值。若指定值key不存在,则添加"key:default"键值对,省略default时,键值对默认为None。例如:

>>> x={'name':'John','age':25}
>>> x.setdefault('name')                #返回指定键的映射值
'John'
>>> x.setdefault('sex')                 #键不存在,为字典添加键值对,映射值默认为None
>>> x
{'age': 25, 'name': 'John', 'sex': None}
>>> x.setdefault('phone','123456')      #添加键值对
'123456'
>>> x
{'age': 25, 'name': 'John', 'sex': None, 'phone': '123456'}
>>>

7.update(other)

该方法用于为字典添加键值对。参数other可以是另一个字典或用赋值格式表示的元组。若字典已存在同名的键,则映射值被覆盖。例如:

>>> x={'name':'John','age':25}
>>> x.update({'age':30,'sex':'male'})           #添加键值对,并覆盖同名键的映射值
>>> x                                           #age的映射值已被修改
{'age': 30, 'name': 'John', 'sex': 'male'}
>>> x.update(name='Mike')                       #修改映射值
>>> x
{'age': 30, 'name': 'Mike', 'sex': 'male'}
>>> x.update(code=110,address='NewStreet')      #添加键值对
>>> x
{'age': 30, 'address': 'NewStreet', 'name': 'Mike', 'sex': 'male', 'code': 110}

4、字典视图

字典的item ()、keys()和values()方法用于返回字典键值对的试图对象。视图对象支持迭代操作,并可反映未来对字典的修改。试图对象不是列表,不支持索引。通常用list()方法将视图对象转换为列表。

1.items()

items()方法返回键值对视图。例如:

>>> x={'name':'John','age':25}
>>> y=x.items()                     #返回键值对视图
>>> y                               #显示键值对视图,键值对视图为dict_items对象
dict_items([('age', 25), ('name', 'John')])
>>> x
{'age': 25, 'name': 'John'}
>>> for a in y:print(a)             #迭代键值对视图
...
('age', 25)
('name', 'John')
>>> x['age']=30                     #修改字典
>>> x
{'age': 30, 'name': 'John'}
>>> y                               #从显示结果可以看出视图反映了字典中的修改内容
dict_items([('age', 30), ('name', 'John')])
>>> list(y)                         #将键值对视图转换为列表
[('age', 30), ('name', 'John')]
>>>

2.keys()

keys()方法返回字典中所有键的视图。例如:

>>> x={'name':'John','age':25}
>>> y=x.keys()                      #返回字典的键视图
>>> y                               #显示键视图,键视图为dict_keys对象
dict_keys(['age', 'name'])
>>> x['sex']='male'                 #为字典添加键值对
>>> x
{'age': 25, 'name': 'John', 'sex': 'male'}
>>> y                               #显示结果说明键视图包含了新添加的键
dict_keys(['age', 'name', 'sex'])
>>> list(y)                         #将键视图转换为列表
['age', 'name', 'sex']
>>>

3.values()

values()方法返回字典中全部值的视图。例如:

>>> x={'name':'John','age':25}
>>> y=x.values()                    #返回字典的值视图
>>> y                               #显示值视图,值视图为dict_values对象
dict_values([25, 'John'])
>>> x['sex']='male'                 #添加键值对
>>> y                               #值视图包含了新添加的值
dict_values([25, 'John', 'male'])
>>> list(y)                         #将值视图转换为列表
[25, 'John', 'male']
>>>

4.键视图的集合操作

键视图支持各种操作运算,键值对视图和值视图不支持集合运算。例如:

>>> x={'a':1,'b':2}
>>> kx=x.keys()         #返回x的键视图
>>> kx
dict_keys(['b', 'a'])
>>> y={'b':3,'c':4}
>>> ky=y.keys()         #返回y的键视图
>>> ky
dict_keys(['b', 'c'])
>>> kx-ky               #求差集
{'a'}
>>> kx|ky               #求并集
{'b', 'a', 'c'}
>>> kx&ky               #求交集
{'b'}
>>> kx^ky               #求对称差集
{'a', 'c'}
>>>