肉渣教程

字典

上一节 下一节

什么是字典?

以前在列表(list)中,可以根据列表的索引来获取该位置的元素对象。列表是一种有序序列,索引是数字。而字典(dict)类型则是无序的,可以根据键(key)来索引到值(value)。键不仅可以是数字,还可以是字符串。在每个字典对象中,每个键是独一无二,不会重复的。

>>> a = { "key1": "value1", "key2": "value2", "key3": "value3" }
>>> a[ "key1" ]
'value1'
>>> a[ "key2" ]
'value2'
>>> a[ "key3" ]
'value3'

运行一下

构建字典的方式

{ 键1:值1, 键2:值2, ... 键n:值n }

构建字典的方式:外侧用大括号{}进行包围,每一组键值之间用英文输入法下的逗号,进行隔开,而键与值之间使用英文输入法下的冒号:进行隔开。举例如下:

>>> a = { 5: 20, "foo": "bar", "zhuan": 4 }
>>> a[ 5 ]
20
>>> a[ "foo" ]
'bar'
>>> a[ "zhuan" ]
4

运行一下

获取字典某键对应的值

有两种常用的方法来获取字典中某键(key)对应的值(value):

  • 使用中括号[]的方式来获取,比如a[ "key1" ]
  • 使用字典对象的内置函数get方法,例如a.get( "key1" )


如果该键在字典对象中是不存在的呢?结论:中括号的方式会报错;get方法会返回None或者预设的缺省值。这就是这两种方式的区别。

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> a[ "k4" ]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'k4'
>>> print a.get( "k4" )
None
>>> print a.get( "k4", "v4" )
v4

运行一下

判断一个键是否存在

判断一个键是否存在有多种方式,如下所示使用in的方式来判断:

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> "k1" in a
True
>>> "k4" in a
False

运行一下


另外一种判断方式,就是使用字典对象的内置函数has_key进行判断:

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> a.has_key( "k1" )
True
>>> a.has_key( "k4" )
False

运行一下

添加或更新字典

只需某个值(value)赋给某个键(key)即可。若该键已经存在,则会更新此键对应的值;若该键不存在,则会添加这个键,并将此键对应到这个与之关联的值。

>>> a = { "k1": "v1" }
>>> a[ "k1" ] = "zhuanfou"
>>> print a
{'k1': 'zhuanfou'}
>>> a[ "k2" ] = 666
>>> print a
{'k2': 666, 'k1': 'zhuanfou'}

运行一下

空字典

如下所示,只使用大括号,即可定义一个空的字典。

>>> a = {}
>>> a[ "风云" ] = "雄霸天下"
>>> print a[ "风云" ]
雄霸天下

运行一下


注意:{}是一个空字典;而不是空集合set([])才是空集合。


删除字典中指定的键值

如下所示,使用del即可删除字典中某对键值;但是被删除的这个键一定要是存在的,否则会出错的。

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> del a[ "k1" ]
>>> a
{'k3': 'v3', 'k2': 'v2'}
>>> del a[ "zhuanfou" ]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'zhuanfou'

运行一下

字典的内置函数

字典(dict)对象常用的内置函数如下表所示:

内置函数 说明
clear 清空字典
get 返回指定键对应的值,若该键不存在,则返回None或已设置的缺省值
keys 以列表的形式返回字典的所有键
items 以列表的形式返回所有的键值,键值以元组(key,value)的形式存在
values 以列表的形式返回字典的所有值
update 用另一个字典的内容更新当前字典


clear函数

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> a.clear()
>>> a
{}

运行一下


keys函数

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> a.keys()
['k3', 'k2', 'k1']

运行一下


values函数

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> a.values()
['v3', 'v2', 'v1']

运行一下


items函数

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> a.items()
[('k3', 'v3'), ('k2', 'v2'), ('k1', 'v1')]

运行一下


update函数

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> a.update( { "k1": 666, "zhuan": "fou" } )
>>> a
{'k3': 'v3', 'k2': 'v2', 'k1': 666, 'zhuan': 'fou'}

运行一下


这里又延伸说一下使用for语句来循环遍历字典;另外注意一下,iteritems方法比items方法效率更高。习惯成自然,这些以后实践中遇到过几次就会记到骨子里去了。


循环遍历字典

可以使用循环来迭代遍历字典。最基础的方法就是for key in 字典对象,该语句就会将字典中的键逐个赋值给循环变量key。(但是循环的顺序是不确定的,毕竟字典是无序的集合体嘛)

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> for key in a:
...     print key, a[ key ]
... 
k3 v3
k2 v2
k1 v1

运行一下


再说一种装叉一些的迭代方式,直接把值(value)也赋值给循环变量:

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> for key, value in a.items():
...     print key, value
... 
k3 v3
k2 v2
k1 v1

运行一下


不过字典如果比较大的话,items方法会效率较低,此时可以用iteritems的方式来替代。(for循环中请习惯性使用iteritems的方法替代items吧,因为iteritems返回的是迭代器,items方法返回的是列表;如果数据过大,列表占用的内存会过大,而迭代器占用的内存是很小且相对固定的。)

>>> a = { "k1": "v1", "k2": "v2", "k3": "v3" }
>>> for key, value in a.iteritems():
...     print key, value
... 
k3 v3
k2 v2
k1 v1

运行一下


关于如何把python中的字典(dict)对象转换成JSON格式字符串,请阅读这里


字典

上一节 下一节