pythoning —— 4、数据类型(字典)

通过之前的内容,我们了解到,列表这种结构适合于将值组织到一个结构中,并通过编号对其进行引用。但是我们有时候会需要一种更便捷明了的方式存取、一种以名字来操作引用值的数据结构,这种类型的数据结构称为映射。字典是python中(本人唯一已知)的映射类型。

字典的使用

  字典这个名称已经给出了其很多的信息,其构造方式是以通过某个特定的词语(键),从而找到他的意义(值)。

  某些情况下用字典会比使用列表让程序结构更加清晰明了。比如:游戏棋盘了、存储文件修改时间了、数字电话了、地址薄了、学生成绩单了。。。

创建和使用字典

  字典可以通过如下方式创建:

>>> testdict = {"test_key1":"test_value1",test_key2":"test_value2"}

  字典有多个键及其对应的值组成,键值对之间以","分割,键是唯一的,值可以重复

dict函数

  可以通过dict函数,将(键值)对的序列建立字典,也可以通过关键字创建字典。

>>> items = [("name","jams"),("age",25)]
>>> test = dict(items)
>>> test
{'name': 'jams', 'age': 25}
>>> d = dict(name = 'Gumbi',age = 23)
>>> d
{'name': 'Gumbi', 'age': 23}  

基本字典操作

  字典基本行为:

    1. len(d)返回d的项的数量;
    2. d[k]返回关联到键k上的值
    3. d[k] = v将v值关联到k键上
    4. del d[k]删除键为k的项
    5. k in d 检查d中是否含有键为k的项

  键类型:字典的键不一定为整型数据,可以使任意不可变类型,如浮点型、字符串、元组等。

  自动添加:键在字典中不存在时,也可为它赋值,这样的操作,会将该键值对插入字典中,完成添加操作

  成员资格:表达式k in d查找的是键而不是值,这与列表、元组、字符串等有区别。其优势也会更加明显,在字典中查看成员资格比列表中的更高效,数据结构规模越大,效率反差越大。

>>> a = {("name","jams"):{'age':23,'add':'dongsanqi'}}
>>> a['testK'] = 'testV'
>>> a
{'testK': 'testV', ('name', 'jams'): {'add': 'dongsanqi', 'age': 23}}
>>> 'testK' in a
True
>>> del a['testK']
>>> a
{('name', 'jams'): {'add': 'dongsanqi', 'age': 23}}
>>> len(a)
1

字典的格式化字符串

  之前字符串格式化中提到过可以用元组来格式化字符串,其实字典也是可以操作的。只是转换说明符要变化一下。话不多说,看代码先。

>>> phonebook = {'king':'1123','joker':'1124','lucy':'1125'}>>> 'king\'s phone number is %(king)s'%phonebook
"king's phone number is 1123"

字典方法

  就像其他内建类型一样,字典也有方法。可能不会像雷暴或字符串方法那么频繁使用,但也是灰常有用哒。

  clear

  clear用于清除字典中的所有项,这个方法为原地操作,无返回值,操作结束后,字典为空字典。

>>> test_dict = {1:'enheng','name':'biubiu','age':34}
>>> test_dict.clear()
>>> test_dict
{}

copy

同列表一样,是个浅拷贝,如果想要避免其带来的负面影响,可以使用深拷贝即deep copy

>>> x = {'name':'admin','val':['foo','bar','baz']}
>>> y = x.copy()
>>> y['name']='fukuda'
>>> y['val'].append('test')
>>> y
{'val': ['foo', 'bar', 'baz', 'test'], 'name': 'fukuda'}
>>> x
{'val': ['foo', 'bar', 'baz', 'test'], 'name': 'admin'}
>>> from copy import deepcopy
>>> z = deepcopy(x)
>>> x['name'] = 'jing'
>>> x['val'].remove('foo')
>>> x
{'val': ['bar', 'baz', 'test'], 'name': 'jing'}
>>> y
{'val': ['bar', 'baz', 'test'], 'name': 'fukuda'}
>>> z
{'val': ['foo', 'bar', 'baz', 'test'], 'name': 'admin'}

fromkeys

  fromkeys使用给定的键建立新的字典,每个键都对应一个默认的值None。此外你还可以直接在dict上面调用该方法,如果不想使用None作为默认值,可以自己提供默认值。

>>> {}.fromkeys('name','age','add')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: fromkeys expected at most 2 arguments, got 3
>>> {}.fromkeys(['name','age','add'])
{'add': None, 'age': None, 'name': None}
>>> dict.fromkeys(['name','age','add'])
{'add': None, 'age': None, 'name': None}
>>> dict.fromkeys(['name','age','add'],'unknown')
{'add': 'unknown', 'age': 'unknown', 'name': 'unknown'}

get

  get是个体面的方法,一般来说,如果你试图直接用d[k]方式访问字典中的不存在的项,会报错,这就尴尬了,而get就不会。他会返回一个None,它还可以指定默认值,这样就会提高程序的容错率。

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

 

pop

  pop方法用来获得对应给定键的值,然后将这个键值对从字典中移除

>>> d = {'x':1,'y':2}
>>> d.pop('x')
1
>>> d
{'y': 2}

setdefault

  setdefault某种意义上与get类似,能够获得与给定键相关联的值,除此之外,它还是get的升级,如果该值不存在,则会设定相应的键值。如果键值存在,就不会改变字典,默认值可选。如果不设定,会默认使用None。

>>> d = {}
>>> d.setdefault('name','king')
'king'
>>> d
{'name': 'king'}
>>> d.setdefault('name','fukuda')
'king'
>>> d
{'name': 'king'}
>>> d.setdefault('age')
>>> d
{'age': None, 'name': 'king'}

update

  update方法可以利用一个字典项更新另一个字典,提供的字典中的项会被添加到旧的字典中,若有相同的键,则会覆盖。

>>> d
{'age': None, 'name': 'king'}
>>> d = {'name':'king','age':23,'add':'dongsanqi'}
>>> du = {'name':'king','age':24,'phone':'1134'}
>>> d.update(du)
>>> du
{'age': 24, 'name': 'king', 'phone': '1134'}
>>> d
{'age': 24, 'phone': '1134', 'name': 'king', 'add': 'dongsanqi'}

 

 

posted @ 2016-05-20 10:37  fukuda  阅读(230)  评论(0编辑  收藏  举报