字典dict是由键值对组成的无序数据集合,字典也被称作关联数组或哈希表。同list列表一样,其也是一种可变容器模型;同 list列表不同的是,list是以连续的整数做为索引,dict 字典则是以关键字做为索引。

每个键与值用冒号隔开(:)每对用逗号分割,整体放在花括号中({})。键必须独一无二,但值则不必。值可以取任何数据类型,但必须是不可变的,如字符串,数或元组。

一、创建字典

方法1

1>>> dict1 = {}
2>>> dict2 = {'361way': 'com', 'port': 80}
3>>> dict1, dict2
4({}, {'port': 80, '361way': 'com'})

方法2

自动python2.2版本起,python dict也支持元素是列表的元组作为参数,如下:

1>>> fdict = dict((['x', 1], ['y', 2]))
2>>> fdict
3{'y': 2, 'x': 1}

第1句中便于理解,可以将其分解为:tuple1=([’x’, 1], [’y’, 2]) ; fdict = dict(tuple1) 。而其经过内部处理过后,结果就变成了第3行。

同理,上面的元素是元组的列表作为参数,也可以通过dict转化为字典(关键是保证以键值对的格式出现):

1>>> dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
2{'sape': 4139, 'jack': 4098, 'guido': 4127}

此处可以参考官方doc说明

方法3

从Python 2.3 版本起, 可以用一个很方便的内建方法fromkeys() 来创建一个”默认”字典, 字典中元素具有相同的值 (如果没有给出, 默认为None )

1>>> ddict = {}.fromkeys(('x', 'y'), -1)
2>>> ddict
3{'y': -1, 'x': -1}
4>>>
5>>> edict = {}.fromkeys(('foo', 'bar'))
6>>> edict
7{'foo': None, 'bar': None}

方法4

1>>> dict(x=1, y=2)
2{'y': 2, 'x': 1}

这里是属于建立一种映射关系的键值对。同时也可见python的dict创建是非常灵活的。

二、值与循环

访问单个值

1>>> dict2 = {'361way': 'com', 'port': 80}
2>>> dict2[361way]
3Traceback (most recent call last):
4  File "<stdin>", line 1, in <module>
5NameError: name '361way' is not defined
6>>> dict2['361way'] //361way的引号不能少不然会报错
7'com'

遍历字典的键值

1>>> dict2 = {'361way': 'com', 'port': 80}
2>>>> for key in dict2.keys():   //自python2.2该句等价于for key in dict2:
3...            print 'key=%s, value=%s' % (key, dict2[key])  //注意缩进
4输出结果
5key=361way, value=com
6key=port, value=80

注意第二行,自python2.2后,直接使用字典名,默认指的是key值。这里的for循环也可以使用D.items()键值对的方式,如下:

1>>>data = {"a" : 1, "b" : 2, "c" : 3}
2>>>for k, v in data.items():
3            print(k, v)
4...
5('a', 1)
6('c', 3)
7('b', 2)

三、dict的内置方法

dict 字典有很多内置方法,字典可以进行比较运算、in操作、len计算 ,除之外,其常用的方法见下表(更多帮助可以通过help(dict)获得 ):

方法名字 操作
dict.clear() 删除字典中所有元素
dict.copy() 返回字典(浅复制)的一个副本
dict.del() 删除字典中的某个键及其对应的值
dict.fromkeysc(seq,val=None) 创建并返回一个新字典,以seq 中的元素做该字典的键,val 做该字典中所有键对应的初始值(如果不提供此值,则默认为None)
dict.get(key,default=None) 对字典dict 中的键key,返回它对应的值value,如果字典中不存在此键,则返回default 的值(注意,参数default 的默认值为None)
dict.has_key(key) 如果键(key)在字典中存在,返回True,否则返回False. 在Python2.2版本引入in 和not in 后,此方法几乎已废弃不用了,但仍提供一个 可工作的接口。
dict.items() 返回一个包含字典中(键, 值)对元组的列表
dict.keys() 返回一个包含字典中键的列表
dict.values() 返回一个包含字典中所有值的列表
dict.iter() 方法iteritems(), iterkeys(), itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代值(类似于内存中的位置),而不是一个列表。
dict.update() 可以理解为求和、追加,将一个字典内的键值对,置于另一个字典内
dict.pop(key[, default]) 和方法get()相似,如果字典中key 键存在,删除并返回dict[key],如果key 键不存在,且没有给出default 的值,引发KeyError 异常。
dict.setdefault(key,default=None) 和方法set()相似,如果字典中不存在key 键,由dict[key]=default 为它赋值。
dict.setdefault(key,default=None) 和方法set()相似,如果字典中不存在key 键,由dict[key]=default 为它赋值。

针对上表的内容,这里举几个示例:

del 删除

1>>> systems = {"mac" : 1, "windows" : 5, "linux" : 1}
2>>> del systems["windows"]
3>>> systems
4{'mac': 1, 'linux': 1}

copy操作

 1>>> original = {"box" : 1, "cat" : 2, "apple" : 5}
 2>>> modified = original.copy()
 3>>> id(original)
 422626208
 5>>> id(modified)
 622705152
 7>>> id(original)
 822626208
 9>>> id(modified)
1022705152
11>>> modified["cat"] = 200
12>>> original
13{'box': 1, 'apple': 5, 'cat': 2}
14>>> modified
15{'box': 1, 'apple': 5, 'cat': 200}

从上面的例子中可以看出,copy操作不是将两个字典名称指向了同一内存地址 (通过id查看,其内存值不同)。通过修改copy集的值后,对原数据并没影响。

fromkeys创建字典

1>>> d = dict.fromkeys('keys', '5')   //这里keys不加引号会报错
2>>> d
3{'y': '5', 'k': '5', 'e': '5', 's': '5'}
4注意上下的区别
5>>> keys = ["bird", "plant", "fish"]
6>>> d = dict.fromkeys(keys, 5)   //这里不加引号不报错此为keys值定义了
7>>> d
8{'plant': 5, 'bird': 5, 'fish': 5}

updater “ 追加 ”方法

由于dict里不存在‘‘+’’ 运算,不过其提供了update方法,但update方法和“+” 运算还是有曲别的。update方法的作用是将后者的键值对增加到前者里,如果前者的key值和后者key值相则,则后值的key对应的vaule值覆盖前者的vaule值,如下

1>>> pets1 = {"cat": "feline", "dog": "canine"}
2>>> pets2 = {"dog": "animal", "parakeet": "bird"}
3>>> pets1.update(pets2)
4>>> pets1
5{'parakeet': 'bird', 'dog': 'animal', 'cat': 'feline'}
6>>> pets2
7{'dog': 'animal', 'parakeet': 'bird'}

以上示例,参考dotnetperls 站点(该站便于理解的图示化的东西,挺有意思) 。

四、总结

字典是python中比较常用的一种数据类型,其属于可变数据类型(同list相同,与tuple不同)。需要特别注意的是dict(字典)不存在分片与求和的概念,这点要和前面种的数据类型进行区分。