Python 映射类型 dict 使用说明

我被代码海扁署名-非商业-禁演绎
阅读 10:04·字数 3021·发布 
Bilibili 空间
关注 960

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为迭代器中的元素,yz为表达式,通常会通过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类型的getsetdefault方法,亦可用来获取字典中的值,他们的参数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类型提供了keysvaluesitems方法,以获取关于键,值,键值对的视图对象,这些对象可被方便的用于循环语句。

需要指出的是,在得到了一个视图对象后,该对象包含的内容可能会发生变化,当字典的键值对被改动时。

在下面的代码中,字典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 mx 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.01是相等的键,因为他们的哈希值相等。

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')