首页 > Python笔记 阅读数:15

Python dict字典详解

在中国古代,字典被称为“字书”,直到《康熙字典》问世,才称“字典”。在字典里,为了检索方便,每个字都是独一无二的,而解释部分则比较随意。

借鉴这个结构,在编程语言中,也有“字典”这样的数据类型,它是由多个“键(key)/值(value)对”构成的。为了区分,每个“键”都必须是“独一无二”的,而“值”就好比字典的“解释部分”,内容随意。

在 Python 中,字典可被视为一种可变容器模型,能存储任意类型的对象,它是一种非常实用的数据类型,特别是在数据处理任务中,应用非常广泛。

在语法细节上,字典中的每个键/值对之间都用冒号:分隔开,不同的键/值对用逗号,分隔,整个字典包括在花括号{ }之中,格式如下所示:
dict1 = {key1:valuel, key2:value2 }   #dict1为字典名称

字典中的“键”有点类似于我们的身份证号码,它必须独一无二,但“值”则不必受此约束,可同可不同。但不同于身份证号码的地方是,我们的身份证号码类型要保持一致,比如说,统一由18位整型或字符型混合而成,而Python字典中的“键”只要保证是“独一无二”的即可,具体是什么类型不做强制要求。它可以是数字、字符串,甚至是其他数据类型,如列表、字典等。

如下所示的字典示例都是合法的。
In [1]: dict1 = {'a':1, '2020':[1,2,3], 100:('hello', 'world') }

在上述字典 dict1 中,包括三组“键/值对”,其中这三个“键”分别为字符串 'a'、'2020' 和数字 100,它们彼此是可区分的,因此也就具备独一无二的特性,故都是合法有效的。三个“值”分别为1(数字)、[1,2,3](列表)和 ('hello','world')(元组)。

下面我们列举一个简单的示例说明字典的用法:
In [2]: print(dict1)           #输出字典dictl中的所有键/值对
{'a':1, '2020':[1, 2, 3],100: ('hello', 'world')

除了通过上述方式显示字典内容,还可以通过 items( )、keys( ) 和 values( ) 等方法,分别显示字典的所有元素(即键/值对)、所有的键和所有的值,代码如下所示:
In [3]: dict1. items ()                #获取字典中所有键/值对元素,并一一封装在元组中
Out[3]: dict_items([ ('a', 1), ('2020', [1, 2, 3]), (100, ('hello', 'world'))])
In [4]: dict1.keys ()                  #获取字典中所有键
Out[4]: dict_keys(['a', '2020'  100])
In [5]: dict1.values ()                #获取字典中所有值
Out[5]: dict_values([l, [1, 2, 3], ('hello', 'world')])

如果我们仅想输出字典中某个键对应的值,该怎么办呢?方法很简单,仅需要把键当作索引,放置于方括号[ ]之中,即可读取出来。
In [6]: dict1[100]     #输出键为100的字典元素值
Out[6]:('hello', 'world')

需要注意的是,在 In [6] 处,方括号[ ]中的数字 100 并不是数组的索引值,虽然它们看起来很像,但它仅仅是字典里的一个键,不过是长着一副整型数字的面孔罢了。如果我们想获得键为 'a' 的值,做类似的操作即可达成目的。
In [7]: dict1['a']
Out[7]: 1

当然,我们也可以利用字典中的 get( ) 方法,提取给定键对应的值,如果键不在字典中,就返回默认值。如果不显式设定默认值,就返回 None。总之,get( ) 方法一定会返回一个值,让程序不报错。该方法的原型如下。

dict.get(key, default=None)


应用 get( ) 方法的示例代码如下所示:
In [8]: age = {'Bob':29, 'Carol':23, 'Alice':26}      #定义个名为 age 的字典
In [9]: age.get ('Bob')   #获取键为 Bob 的值
Out[9]: 29
In [10]: age.get('Zhang', '此人不在字典中!') #如果键不在字典中,返回默认值
Out[10]:'此人不在字典中!

因为字典属于可变的数据类型,因此如果我们想修改某个字典元素的值,是容易做到的,仅仅对某个给定“键”对应的元素,进行二次赋值即可。
In [11]: age['Bob'] = 40           #将键为 'Bob,的值改为 40
In [12]: age['Bob']                #验证,再次输出键为 'Bob' 的值
Out[12]: 40

如果我们想为字典添加一个元素,该怎么办呢?方法并不复杂,直接在字典中用方括号[ ]给出新的键,并赋值即可,代码如下所示:
In [13]: age ['Zhang'] = 35    #为字典添加新的键 'Zhang' 然后赋值
In [14]: age                   #验证输出字典中所有元素
Out[14]: {'Bob': 40, 'Carol': 23, 'Alice': 26, 'Zhang': 35}

我们还可以利用 update( ) 方法,将一个字典整体更新(添加)到另一个字典中,这个操作相当于列表或元组的连接+操作,示例代码如下:
In [15]:age2 = {'Zhao': 40}   #构造一个新字典 age2
In [16]:age.update(age2)      #把 age2 的元素(可以是多个)更新到旧字典 age 中
In [17]: age                  #验证输出
Out [17]:{'Bob': 29, 'Carol': 23, 'Alice': 26, 'Zhang': 35, 'Zhao': 40}

如果我们想删除某个键对应的字典元素,可以使用 pop( ) 将其弹出。
In [18]: age .pop('Zhang') #弹出键为 'Zhang' 的元素,并返回该键对应的值
Out[18]: 35
In [19]: age               #验证输出字典中所有元素,键为 'Zhang' 的元素已然消失
Out[19]: {'Bob': 29, 'Carol': 23, 'Alice': 26, 'Zhao': 40}

前面的 pop( ) 方法通过“指名道姓”(特定“键”)的方式将字典中某个特定元素删除。其实,还有一种可匿名将字典最后一个元素弹出的方法,就是 popitem( ),其返回值是一个键/值对,它按照栈(stack)的数据结构,依据 LIFO(Last In First Out,后进先出)规则,将字典最末尾的键/值对弹出(实际上也是一种删除操作).

示例代码如下:
In [20]: person = {'Name': 'Alice',  'Age': 11, 'Sex':'Female'}
In [21]: pop_obj = person.popitem()
In [22]: print(pop_obj)
('Sex', 'Female')
In [23]: print(person)
{'Name':'Alice', 'Age': 11}

相关文章