python基础(四)字典Dictionary
字典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(字典)不存在分片与求和的概念,这点要和前面种的数据类型进行区分。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-dicts/3634.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.