Python3 字典(上)

字典也是 Python 提供的一种常用的数据结构,它用于存放具有映射关系的数据。

字典是另一种可变容器模型,且可存储任意类型对象。

字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号{}中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

python 字典

由于字典中的 key 是非常关键的数据,而且程序需要通过 key 来访问 value,因此字典中的 key 不允许重复。键必须是唯一的,但值则不必。 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。

python中的字典主要从以下几个点来讲:

  1. python字典的应用场景
  2. python创建字典的语法
  3. python字典常用操作之增加
  4. python字典常用操作之删除
  5. python字典常用操作之修改
  6. python字典常用操作之查找
  7. python字典的循环遍历之key
  8. python字典的循环遍历之value
  9. python字典的循环遍历之键值对
  10. python字典的循环遍历之键值对(拆包)

1、字典的应用场景

思考1:如果有多个数据,例如:姓名,'David',性别,'男',年龄,20,语文,130 这种数据怎么存储呢?

有的同学在想我可以把所有的数据存在列表中呀!例如:

#!/usr/bin/python3
mylist=['David','男',20,130]
print(mylist)

思考2:如何查找到数据'David'?

答:查找到下标为0的数据即可.

mylist[0]

思考3:如果将来数据顺序发生了变化,删除了某笔数据,或增加了某笔数据,或者排序了,数据的顺序就会发生变化,那我们还能用mylist[0]访问到'David'数据吗?例如下面的列表的顺序发生了变化

mylist=[130,20,'男','David']

答:不能,数据'David'此时的下标为3

思考4:有没有一种数据结构跟数据的前后顺序没有关系呢?

也能正常的存储多个数据,也能查询数据呢?

答:在python中用字典就可以很好的解决这个问题。

如果我们有多个数据,同时想做为一个整体来存储,那么我们在python中就用字典,因为字典里面的数据是以键值对的形式出现额,字典的数据和数据的顺序是没有关系的,即字典不支持下标,后期无论数据如何变化,只需要按照对应的键的名字查找即可。

2、python创建字典的语法

python字典特点:

符号为大括号{}

数据为键值对形式出现

各个键值对之间用逗号隔开

2.1 有数据字典创建方式

#!/usr/bin/python3
#有数据的字典的创建:name的值是新编程,url的值是www.xinbiancheng.cn
mydict = {'name': '新编程', 'url': 'www.xinbiancheng.cn'}
print(mydict)
print(type(mydict))
#以下代码创建的字典中第一个 key 是元组,第二个 key 是整数值,这都是合法的。
dict2 = {(1,2):'www.xinbiancheng.cn', 3:'www.baidu.com'}
print(dict2)

通过type来检测数据类型,运行显示结果如下(<class 'dict'>证明是字典类型):

{'name': '新编程', 'url': 'www.xinbiancheng.cn'}
<class 'dict'>
{(1, 2): 'www.xinbiancheng.cn', 3: 'www.baidu.com'}

注意:元组可以作为 dict 的 key,但列表不能作为元组的 key。这是由于 dict 要求 key 必须是不可变类型,但列表是可变类型,因此列表不能作为元组的 key。

2.2 创建空字典的两种方式

#!/usr/bin/python3
#第一种方式创建空字典
mydict2 = {}
print(type(mydict2))
#第二种方式创建空字典
mydict3 = dict()
print(type(mydict3))

运行结果显示如下:

<class 'dict'>
<class 'dict'>

2.3 dict() 函数

在python使用 dict() 函数创建字典时,可以传入多个列表或元组参数作为 key-value 对,每个列表或元组将被当成一个 key-value 对,因此这些列表或元组都只能包含两个元素。例如如下代码:

#!/usr/bin/python3
vegetables = [('celery', 1), ('brocoli', 2), ('lettuce', 3)]
# 创建包含3组key-value对的字典
mydict = dict(vegetables)
print(mydict) # {'celery': 1, 'brocoli': 2, 'lettuce': 3}
fruits1 = [['Apple', 8.5],['Apricot', 8.5],['Almond', 8.5]]
# 创建包含3组key-value对的字典
dict1 = dict(fruits1)
print(dict1) # {'Apple': 8.5, 'Apricot': 8.5, 'Almond': 8.5}
fruits2 = [['Apple', 8.5],['Apricot', 8.5, 10],['Almond', 8.5]]
dict2 = dict(fruits2) #报错信息如下:(因为有个三个参数)['Apricot', 8.5, 10]
'''Traceback (most recent call last):
  File "G:/xinbiancheng.cn/article/article/article/test.py", line 10, in <module>
    dict2 = dict(fruits2)
ValueError: dictionary update sequence element #1 has length 3; 2 is required'''
print(dict2)

还可通过为 dict 指定关键字参数创建字典,此时字典的 key 不允许使用表达式。例如如下代码:

# 使用关键字参数来创建字典
dict5 = dict(spinach = 1, cabbage = 2)
print(dict5) # {'spinach': 1, 'cabbage': 2}

python代码在创建字典时,其 key 直接写 spinach、cabbage,不需要将它们放在引号中

3、字典的常用方法

在python中,如果我们忘记字典有哪些方法呢?我们可以用dir()这个方法进行查询,字典由 dict 类代表,因此我们同样可使用 dir(dict) 来查看该类包含哪些方法。在交互式解释器中输入 dir(dict) 命令,将看到如下输出结果:

>>> dir(dict)
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']

从dir()打印的结果我们就知道dict有哪些方法了,主要的有['clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']后面我们对这些方法进行一一讲解

4、字典键的特性

字典值可以是任何的 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。

两个重要的点需要记住:

1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住

#!/usr/bin/python3 
dict = {'Name': 'baidu.com', 'Age': 7, 'Name': 'xinbiancheng.cn'} 
print ("dict['Name']: ", dict['Name'])

以上实例字典输出结果:

dict['Name']:  xinbiancheng.cn

2)键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行

# !/usr/bin/python3
dict = {['Name']: 'xinbiancheng.cn', 'Age': 7}
print("dict['Name']: ", dict['Name'])

以上实例输出结果如下:

Traceback (most recent call last):
  File "G:/xinbiancheng.cn/article/article/article/test.py", line 23, in <module>
    dict = {['Name']: 'xinbiancheng.cn', 'Age': 7}
TypeError: unhashable type: 'list'

5、Python对字典的增,删,改,查,及遍历

请点击 Python字典(下)

6、字典内置函数&方法

函数 描述

len(dict)

计算字典元素个数,即键的总数

>>> dict = {'Name': 'xinbiancheng.cn', 'Age': 7, 'Class': 'First'}
>>> len(dict)
3

 

str(dict)

输出字典,以可打印的字符串表示

>>> dict = {'Name': 'xinbiancheng.cn', 'Age': 7, 'Class': 'First'}
>>> str(dict)
"{'Name': 'xinbiancheng.cn', 'Age': 7, 'Class': 'First'}"

 

type(variable)

返回输入的变量类型,如果变量是字典就返回字典类型

>>> dict = {'Name': 'xinbiancheng.cn', 'Age': 7, 'Class': 'First'}
>>> type(dict)
<class 'dict'>

 

7、Python字典包含了以下内置方法:

函数 描述
radiansdict.clear() 删除字典内所有元素
radiansdict.copy() 返回一个字典的浅复制
radiansdict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
radiansdict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值
key in dict 如果键在字典dict里返回true,否则返回false
radiansdict.items() 以列表返回可遍历的(键, 值) 元组数组
radiansdict.keys() 返回一个迭代器,可以使用 list() 来转换为列表
radiansdict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
radiansdict.update(dict2) 把字典dict2的键/值对更新到dict里
radiansdict.values() 返回一个迭代器,可以使用 list() 来转换为列表
pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值
popitem() 随机返回并删除字典中的最后一对键和值