Python 映射类型 dict 使用说明
Python 映射类型
Python 的映射类型dict
使用键值对来存储数据,键值对的键和值保持了映射关系。作为键的对象需要具有__hash__
和__eq__
两种方法,以确保不会存在两个相等的键,这与 Python 集合类型对元素的要求类似。
Python 对象的 __hash__ 和 __eq__ 方法
对象的__hash__
方法,返回对象对应的哈希值,在 Python 中,该值应该是一个整数。对象的__eq__
方法,用于判断对象之间是否是相等的关系。
集合类型
关于 Python 的集合类型,你可以查看Python 集合类型 set,frozenset 使用说明一节。
Python dict 类型
Python 的字典dict
,可通过{}
创建,{}
中是字典的键值对,键值对之间使用,
分隔,键值对的键与值之间使用:
分隔。
你可以像在集合中一样使用推导式来显现略微复杂的设计,其格式为z: y for x in iterable
,其中,iterable
为迭代器对象,x
为迭代器中的元素,y
,z
为表达式,通常会通过x
产生值和键。
dict
类型的fromkeys
方法,可通过给出的迭代器对象来创建新的字典,字典中的所有键值对都具有相同的值。此外,dict
类型的构造器也是创建字典对象的途径之一。
dict.fromkeys(iterable, value=None, /)
- iterable 参数
iterable
参数是一个包含键的迭代器对象。- value 参数
value
参数为键值对的值,默认为None
。
dict(*args, **kwargs)
- args 参数
虽然可变参数
args
包含了所有未定义的位置参数,但事实上dict
接受的位置参数只有一个。如果位置参数是映射对象,则将创建一个与该映射对象键值对相同的字典,这类似于阴影复制,映射对象和被创建的字典中的值,可能保持对同一实例的引用。如果位置参数不是映射对象,那么他需要是一个迭代器对象,迭代器中的元素应该包含两个子元素,以分别表示键值对的键和值。
- kwargs 参数
可变参数
kwargs
包含了所有未定义的关键字参数,这些关键字参数的参数名和值会组成字典的键值对。
创建 Python 字典时重复出现的键
在创建字典时,如果同一个键重复出现,那么该键最后一次出现的值才是有效的。比如在构造器中,关键字参数指定的值会覆盖位置参数指定的值。
函数
要想深入了解 Python 函数中的各种参数,你可以查看Python 函数,参数,返回值介绍,以及 Python 函数的定义和调用一节。
{"name": "Jack", 'age': 123}
{'name': 'Jack', 'age': 123}
{f'key_{x}': x for x in range(1, 3)}
{'key_1': 1, 'key_2': 2}
dict.fromkeys((1, 2), '')
{1: '', 2: ''}
dict([['name', 'Jack']], age=10)
{'name': 'Jack', 'age': 10}
访问 Python 字典中的值
要读取或写入字典中的值,你需要给出对应的键,其书写方式为d[key]
或d[key]=value
,其中d
为字典对象,key
为键,value
为值。
对于d[key]
,如果给出的键key
在字典中不存在,且字典对象拥有__missing__
方法,则__missing__
会被调用,以返回合适的值或引发某种异常,如果__missing__
方法不存在,那么默认引发异常KeyError
。
Python 对象的 __missing__ 方法
Python 对象的__missing__
方法,会在__getitem__
方法找不到指定值时被调用,他的参数可以是字典键值对的键,或其他用于确定值的内容。如果__missing__
方法返回了某个值,则该值可作为__getitem__
方法的返回值,对于 Python 字典来说,这并不意味着会在字典中产生新的键值对。
除了使用d[key]
,dict
类型的get
和setdefault
方法,亦可用来获取字典中的值,他们的参数key
表示键值对的键,default
为键值对的默认值。
get
方法可以获取键key
对应的值,如果字典中不存在键key
,则返回参数default
表示的默认值,若未指定default
,则此时返回None
。需要说明的是,get
方法并不会向字典添加新的键值对,即便给出了default
参数。
与get
方法类似,setdefault
方法同样可以获取键key
对应的值,并指定键不存在时的默认值。不同是该方法会在key
不存在时,为字典添加新的键值对,key
将作为键值对的键,default
将作为键值对的值,如果未指定default
,则键值对的值为None
。
get(key, default=None, /)
setdefault(key, default=None, /)
在下面的 Python 代码中,虽然键'age'
不存在,但get
方法并没有为字典添加新的键值对。
d = {'name': 'Tom'}
d.get('age', 0)
0
d
{'name': 'Tom'}
d.setdefault('age', 0)
0
d
{'name': 'Tom', 'age': 0}
获取 Python 字典的视图对象
Python 的dict
类型提供了keys
,values
,items
方法,以获取关于键,值,键值对的视图对象,这些对象可被方便的用于循环语句。
需要指出的是,在得到了一个视图对象后,该对象包含的内容可能会发生变化,当字典的键值对被改动时。
在下面的代码中,字典d
的键视图对象发生了变化,在字典被添加了新的键值对后。
d = {'name': 'Tom'}
k = d.keys()
k
dict_keys(['name'])
d['age'] = 10
k
dict_keys(['name', 'age'])
获取 Python 字典中键值对的个数
Python 中的函数len
,可用于获取字典的键值对个数,比如,len({'name': 'Jack', 'age': 10})
的运算结果为2
。
判断 Python 字典中是否存在某个键
使用x in m
或x not in m
,可以判断字典中是否存在或不存在某个键,x
表示键,m
表示字典。
'age' not in {'name': 'Jack', 'age': 10}
False
联接 Python 字典
使用运算符|
可以联接 Python 字典,该运算符左右两边字典的键值对,将被用于创建新字典,对于键相等的键值对,最后出现的一个将被采纳。
{'name': 'Jack'} | dict(name="Tom", age=10)
{'name': 'Tom', 'age': 10}
复制 Python 字典
使用 Python 字典的copy
方法,可以对字典进行阴影复制,复制的字典与被复制的字典将互不影响,但两个字典中的值可能是同一个对象。
在下面的代码中,字典b
添加的键值对并未影响字典a
,但两个字典'items'
对应的值,指向了同一个列表。
a = {'items': []}
b = a.copy()
a.get('items').append(123)
b['count'] = 100
a
{'items': [123]}
b
{'items': [123], 'count': 100}
更新 Python 字典
使用dict
类型的update
方法,你可以对字典的多个键值对进行更新,如果需要更新的键值对不存在,则他将被创建,如果键相等的键值对被更新了多次,那么最后一次更新才是有效的。
此外,使用运算符|=
可以产生与update
方法相同的效果,运算符右边字典的键值对,将用于更新左边的字典。
update([other, /, ]**kwargs)
- other 参数
如果
other
参数是一个字典对象,那么该字典的键值对将被用于更新目标字典。如果other
参数是一个迭代器对象,那么迭代器中的元素需要包含两个子元素,以对应键值对的键和值。- kwargs 参数
如果指定了关键字参数,那么这些参数的参数名和值,将用于更新字典的键值对。
在下面的代码中,1.0
与1
是相等的键,因为他们的哈希值相等。
d = {'name': 'Jack'}
d.update({1.0: 'A number!'}, name='Tom')
d
{'name': 'Tom', 1.0: 'A number!'}
d |= {1: 'Number'}
d
{'name': 'Tom', 1.0: 'Number'}
删除 Python 字典中的键值对
del
关键字可用于删除 Python 字典的键值对,其格式为del d[key]
,d
为字典对象,key
为需要删除的键值对的键。当键key
在字典中不存在时,del d[key]
将引发异常KeyError
。
字典的pop
方法可用于删除指定的键值对,被删除的键值对的值将作为返回值返回。如果指定键值对不存在且未提供默认值,则将引发异常KeyError
。
字典的popitem
方法可用于删除最后被创建的键值对,并将被删除的键值对作为元组返回,元组的第一个元素为键,第二个元素为值。如果字典不存在任何键值对,则调用popitem
将引发异常KeyError
。
Python 3.7 之前,popitem
方法会删除任意键值对。
字典的clear
方法,将删除字典中所有的键值对。
pop(key[, default], /)
- key 参数
参数
key
为需要删除的键值对的键,该键值对的值将被返回。- default 参数
当键值对不存在时,将返回
default
参数表示的默认值。
c = {'name': 'Jack'}
c['age'] = 10
c.popitem()
('age', 10)
c.pop('id', 1000)
1000
del c["name"]
c
{}
操作 Python 字典中的键
你可以使用list
类型的构造器创建一个关于键的列表,使用iter
方法创建一个关于键的迭代器对象,使用reversed
方法创建一个顺序反转的键的迭代器对象。
序列类型
想要了解 Python 列表,你可以查看Python 序列类型 list,tuple,range 使用说明一节。
d = dict((("name", "Jack"),("age", 10)))
list(d)
['name', 'age']
tuple(iter(d))
('name', 'age')
tuple(reversed(d))
('age', 'name')