概述
字典dict是非常非常重要的一个数据结构.甚至可以说是python中最重要的一种数据结构.
相等于其他数据结构类型(list,set,tuple)来说,dict又是一个更加复杂,更加综合型的结构类型.
相比其他三个原生的数据结构,dict的元素采用键值对的方式.
主键与set一样,具有唯一性,同时也必须可hash;而值可以是任何对象.什么叫任意对象?python一切皆对象.
dict的特性
-
可hash性
dict的主键必须是可hash的,也就是必须是不可变类型.比如字符,数字,原则可以作为主键,而列表,集合就不可以作为主键.
主键的可hash性就也导致了主键的唯一性.同时也为dict带了很快的查询速度.
-
唯一性
在一个dict中,主键是不能重复的,一旦出现重复,则后来者覆盖先来者.
-
包容性
dict对主键有可hash,唯一的要求,而对主键的值也没有任何要求,可以是任意的类型.只要是pyhton中的对象,就都可以成为值.
增删改查
既然dict是如此的重要数据结构,那么介绍一下dict的增删改查.
-
查询访问
访问dict中的数据,有两种方式.
一是直接使用"[ ]"的方式,但如果访问的是不存在的主键,则会抛出KeyError的错误.
d={'a':1,'b':2}
print(d['b'])
print(d['c'])
#输出:
2
Traceback (most recent call last):
File "D:/Pycharm/Never_Give_Up/zy_every_days/0910.py", line 4, in <module>
print(d['c'])
KeyError: 'c'
第二种方式是python提供搞得dict的一个方法,使用该get方法,若该dict中存在查询的主键则返回值,否则返回设定的默认值.
d={'a':1,'b':2}
print(d.get('a'))
print(d.get('c','no such key'))
#输出:
1
no such key
dict原生的values,keys,items方法还可以返回该dict中所有的值,主键,以及键值对.
返回的数据类似列表,可以切片,可以遍历,同时可以使用list,tuple等函数直接转变其数据类型.
d={'a':1,'b':2}
print(d.values())
print(d.keys())
print(d.items())
# 输出:
dict_values([1, 2])
dict_keys(['a', 'b'])
dict_items([('a', 1), ('b', 2)])
-
增加修改
要为dict添加数据,也是直接使用"[ ]"进行赋值即可.
d={'a':1,'b':2}
d['c']=3
d['a']=100
print(d)
#输出:
{'a': 100, 'b': 2, 'c': 3}
当添加的新key不在当前dict中时.则会添加,但添加当前dict中已经存在的主键时,因为唯一性原则,则会覆盖掉之前的数据.
此时,dict提供了一个setdefault方法,该方法的作用是,当添加的key不在dict中时,为其添加数据,若添加的key在dict中时,则不做
忽略当前操作,既不做任何操作.
d={'a':1,'b':2}
d.setdefault('c',3)
d.setdefault('a',100)
print(d)
#输出:
{'a': 1, 'b': 2, 'c': 3}
若要将两个dict进行合并时的更新,则可以使用update方法.
注意,若存在重复的数据,同样之前的数据被会后来者的数据覆盖.
d={'a':1,'b':2}
c={'c':3,'a':100}
d.update(c)
print(d)
#输出:
{'a': 100, 'b': 2, 'c': 3}
-
删除
要删除dict中的某个键值对,直接使用pyhton中内置的del方法即可.
d={'a':1,'b':2}
del d['b']
print(d)
#输出:
{'a': 1}
-
创建
dict是以键值对形式存在的,下面介绍下几种常见的创建方式.
第一种,直接使用{:}
d={'a':1,'b':2}
第二种,使用dict和键值对的方法
d=dict(a=1,b='abc')
print(d)
#输出:
{'a': 1, 'b': 'abc'}
或者以两个元素一组的序列
d=dict((('a',1),['b',2]))
c=dict([[1,2],['a','b']])
print(d)
print(c)
#输出:
{'a': 1, 'b': 2}
{1: 2, 'a': 'b'}
第三种,使用 dict自带的fromkeys方法,快速创建.
该方法给定的序列(iterable)中的每一个元素做字典的键,并为其设定对应的初始值.
d=dict.fromkeys('ab',100)
c=dict.fromkeys(['aa','bb'],None)
print(d)
print(c)
#输出:
{'a': 100, 'b': 100}
{'aa': None, 'bb': None}
第四种,结合内置的zip函数快速创建.
zip函数以迭代器的形式将对应对象的元素打包成配对的元组.
L1=['a','b','c']
L2=[1,2,3]
d=dict(zip(L1,L2))
print(d)
#输出:
{'a': 1, 'b': 2, 'c': 3}
常用方法
序号 | 方法 | 说明 |
1 | dict.clear() | 清空字典 |
2 | dict.copy() | 返回一个字典的浅复制 |
3 | dict.fromkeys(iterable,value) | 创建一个新字典,以序列iterable中元素做字典的键,value为字典所有键对应的初始值 |
4 | dict.get(key, default=None) | 返回指定键的值,如果值不在字典中返回default值 |
5 | dict.items() | 以返回可遍历的(键, 值) 元组数组 |
6 | dict.keys() | 以返回一个字典所有的键 |
7 | dict.values() | 以返回字典中的所有值 |
8 | dict.setdefault(key, default=None) | 和get()类似, 如果键不存在于,将会添加键并将值设为default,如果存在则不进行任何操作. |
9 | dict.pop(key) | 抛出字典给定键 key 所对应的值,返回值为被抛出的值。key值必须给出。 |
10 | dict.popitem() | 抛出字典中的一对键和值(一般为最后添加的数据)。 |
11 | dict.update(dict2) | 把字典dict2的键/值对更新到dict里,原dict被改变 |