python基础(四)字典Dictionary

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

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

一、创建字典

方法1

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

方法2

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

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

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

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

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

此处可以参考官方doc说明

方法3

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

>>> ddict = {}.fromkeys(('x', 'y'), -1)
>>> ddict
{'y': -1, 'x': -1}
>>>
>>> edict = {}.fromkeys(('foo', 'bar'))
>>> edict
{'foo': None, 'bar': None}

方法4

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

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

二、值与循环

访问单个值

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

遍历字典的键值

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

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

>>>data = {"a" : 1, "b" : 2, "c" : 3}
>>>for k, v in data.items():
            print(k, v)
...
('a', 1)
('c', 3)
('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 删除

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

copy操作

>>> original = {"box" : 1, "cat" : 2, "apple" : 5}
>>> modified = original.copy()
>>> id(original)
22626208
>>> id(modified)
22705152
>>> id(original)
22626208
>>> id(modified)
22705152
>>> modified["cat"] = 200
>>> original
{'box': 1, 'apple': 5, 'cat': 2}
>>> modified
{'box': 1, 'apple': 5, 'cat': 200}

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

fromkeys创建字典

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

updater “ 追加 ”方法

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

>>> pets1 = {"cat": "feline", "dog": "canine"}
>>> pets2 = {"dog": "animal", "parakeet": "bird"}
>>> pets1.update(pets2)
>>> pets1
{'parakeet': 'bird', 'dog': 'animal', 'cat': 'feline'}
>>> pets2
{'dog': 'animal', 'parakeet': 'bird'}

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

四、总结

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




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.