Python 字典

字典

定义

字典用于存储一系列键值对,并且字典是动态的,与列表类似,可随时在字典中添加 键值对

其中每个 都与一个 相关联,知道了键就可以访问与其相关联的值

与键关联的可以是任意对象,例如:数字、字符串、列表以及字典等。

字典与列表、元组的表示方式不同,主要使用 花括号{},在花括号中存放的是一个个键值对

diction = {'color': 'red', 'name' : 'Sean'}

字典使用 花括号 {}

列表使用 方括号 []

元组使用 圆括号 ()

键与值之间使用 冒号 : 分隔,键值对之间使用 逗号 分隔

字典中对于键值对个数是没有限制的,若定义的键值对较多,可以多行定义

>>> ages = {
...     'Bob' : 23,
...     'Mary' : 19,
...     'Kevin' : 30,
... 	}
>>> print(ages)
{'Bob': 23, 'Mary': 19, 'Kevin': 30}

注意:多行定义时,最后一个键值对后面最后加上一个 逗号,方便以后修改代码;并且右花括号最好与键对齐,显得美观

空字典

使用空的花括号定义 空字典

方式:变量 = {}

>>> colors = {}
>>> print(colors)
{}
>>> type(colors)
<class 'dict'>

创建字典的另外一种方法

若给定了多个 键,可以使用 fromkeys()函数 来创建字典,每个键都会被设置为默认值None,也可以传入另外一个参数来设置默认值

第一个参数的 多个键 可以使用 列表或者元组 来表示

方式:变量 = dict.fromkeys([], 默认值)

变量 = dict.fromkeys((), 默认值)

>>> diction1 = dict.fromkeys(['Bob', 'Jack'])
>>> print(diction1)
{'Bob': None, 'Jack': None}
>>> diction2 = dict.fromkeys(('Bob', 'Jack'))
>>> print(diction2)
{'Bob': None, 'Jack': None}
>>> diction3 = dict.fromkeys(('Bob', 'Jack'), 'DEFAUTL')
>>> print(diction3)
{'Bob': 'DEFAUTL', 'Jack': 'DEFAUTL'}
>>> diction4 = dict.fromkeys(['Bob', 'Jack'], 'DEFAUTL1')
>>> print(diction4)
{'Bob': 'DEFAUTL1', 'Jack': 'DEFAUTL1'}

访问字典

  • 方括号方式访问
  • get() 函数
  • setdefault() 函数

方括号方式访问

若想获取字典中与 键 相关联的 值,需要指定 字典名,并在字典名后面的方括号中指定

方式:字典名[键]

>>> diction = {'color' : 'red', 'names' : 'sean'}
>>> print(diction['color'])
red

此处与元组、列表获取元素信息相似,都是在方括号内指定目标元素

元组:元组名[索引]

列表:列表名[索引]

字典:字典名[键]

若方括号内的键不存在,会报 键错误,KeyError

>>> names = {'name' : '1', 'age' : 2}
>>> print(names['grade'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'grade'

通过get()函数

该函数与 方括号方式访问 类似,区别在于:若方括号访问的键不存在,会报错误 KeyError,而若使用 get()函数,则会返回 None

方式:字典名.get(键)

>>> names = {'name' : '1', 'age' : 2}
>>> print(names.get('grade'))
None
>>> print(names.get('name'))
1

setdefault() 函数

使用 setdefault() 函数,可以根据 键 来得到与其相关联的 值。

当 键 在字典中不存在时,该函数会为这个 键 设置一个默认值,再返回该 键 的值。

方式:字典名.setdefault(键, 值)

>>> names = {'name' : '1', 'age' : '2', 'day' : '30'}
>>> print(names.setdefault('name'))
1
>>> print(names.setdefault('money'))
None
>>> print(names)
{'name': '1', 'age': '2', 'day': '30', 'money': None}
>>> print(names.setdefault('name', '3'))
1
>>> print(names)
{'name': '1', 'age': '2', 'day': '30', 'money': None}
>>> print(names.setdefault('job', '35'))
35
>>> print(names)
{'name': '1', 'age': '2', 'day': '30', 'money': None, 'job': '35'}

由上面的代码可知:

  • 若目标键存在,则该函数会返回与其关联的值
  • 若目标键存在,且第二个参数也设置了值,则 新值 不会修改 原值,即字典不会变
  • 若目标键不存在,且第二个参数未赋值,则会为该 键 设置默认值,并添加该 键值对 到字典中(默认值通常是 None)
  • 若目标键不存在,且第二个参数赋值了,则会将该 键值对 添加到字典中

修改字典

字典是动态的,可以随时修改字典

添加键值对

  • 使用方括号形式添加
  • 使用 update() 函数
  • 使用 setdefault() 函数

方括号赋值

添加键值对时,需要指定 字典名新添加的键名 以及 与键关联的值

方式:字典名[键] = 值

>>> diction = {'color' : 'red', 'names' : 'sean'}
>>> print(diction)
{'color': 'red', 'names': 'sean'}
>>> diction['age'] = 24
>>> print(diction)
{'color': 'red', 'names': 'sean', 'age': 24}

列表中,添加元素的方法主要是 append(值)、insert(索引, 值)

元组不能动态增加,只能是重新对元组变量赋值

键值对的排列顺序与其添加顺序并不相同,Python更加关注 键和值之间的关联关系,而不是 键值对的添加顺序。同理,在获取字典时,获取的顺序是不可预测的。

update() 函数

update() 函数可以实现对字典键值对的更新

若键已存在,则将新值覆盖原本与键相关联的值

若键不存在,则会将这个键值对添加到字典中

方式:字典名.update({键:值, 键:值, ...})

>>> names = {'name' : '1', 'age' : 2}
>>> names.update({'name' : '2'})
>>> print(names)
{'name': '2', 'age': 2}
>>> names.update({'day' : '88'})
>>> print(names)
{'name': '2', 'age': 2, 'day': '88'}

setdefault() 函数

方式:字典名.setdefault(键, 值)

若目标键在字典中不存在,且第二个参数未赋值,则会对该键设置默认值None,并将该键值对添加到字典中

若目标键在字典中不存在,且第二个参数赋值了,则会将该键值对添加到字典中

>>> names = {'name' : '1', 'age' : '2', 'day' : '30'}
>>> print(names.setdefault('money'))
None
>>> print(names)
{'name': '1', 'age': '2', 'day': '30', 'money': None}
>>> print(names.setdefault('job', '35'))
35
>>> print(names)
{'name': '1', 'age': '2', 'day': '30', 'money': None, 'job': '35'}

删除键值对

  • del语句
  • pop() 函数

del语句

使用 del语句 可以删除不需要的键值对,这种删除是彻底删除,永远消失了

需要指定需要删除的 字典名 与 键

方式:del 字典名[键]

>>> diction = {'color' : 'red', 'names' : 'sean'}
>>> print(diction)
{'color': 'red', 'names': 'sean'}
>>> del diction['names']
>>> print(diction)
{'color': 'red'}

删除列表的元素可以使用:del语句、pop()、pop(索引)、remove(值)

删除元组可以使用:del语句

pop() 函数

pop()函数的参数是 要删除的键,该函数会返回该键的值,并且删除该键值对

>>> names = {'name' : '1', 'age' : 2}
>>> name = names.pop('name')
>>> print(name)
1
>>> print(names)
{'age': 2}

删除整个字典

使用 del语句 还可以直接删除整个字典

方式:del 字典名

>>> diction = {'color' : 'red', 'names' : 'sean'}
>>> print(diction)
{'color': 'red', 'names': 'sean'}
>>> del diction
>>> print(diction)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'diction' is not defined

修改字典中的值

修改字典中的值的方式类似于 添加键值对,只不过所指定的 键名 是字典中已存在的键名,而添加键值对时所指定的键是字典中不存在的键

方式:字典名[键] = 值

>>> diction = {'color' : 'red', 'names' : 'sean'}
>>> print(diction)
{'color': 'red', 'names': 'sean'}
>>> diction['color'] = 'blue'
>>> print(diction)
{'color': 'blue', 'names': 'sean'}

列表中修改元素的值:列表名[索引] = 值

要修改元组的值,只能是重新定义整个元组变量

使用 update() 函数同样可以实现修改字典中的值

>>> names = {'name' : '1', 'age' : 2}
>>> names.update({'name' : '2'})
>>> print(names)
{'name': '2', 'age': 2}

清空键值对

使用 clear()函数 可以清空字典中所有的键值对,字典会变成空字典

>>> names = {'name' : '1', 'age' : 2}
>>> print(names)
{'name': '1', 'age': 2}
>>> names.clear()
>>> print(names)
{}

随机弹出一个键值对

使用 popitem() 函数,可以随机弹出字典中的一个键值对

注意:该函数弹出的键值对是一个元组

>>> names = {'name' : '1', 'age' : '2', 'day' : '30'}
>>> print(names.popitem())
('day', '30')
>>> print(names)
{'name': '1', 'age': '2'}

遍历字典

遍历字典的方式主要有三种:

  • 遍历字典的所有键值对 items()函数
  • 遍历字典的所有键 默认是遍历所有键或显式调用keys()函数
  • 遍历字典所有的值 values()函数

注:对于这三个函数的使用不要死板,它们的返回值是个列表,不一定非得遍历时才能用,在判断一个值是否是该字典的键或者值时也可以使用

if i in diction.values:
    print(i)

遍历所有键值对

关键:两个临时变量、for 循环、对字典变量调用 items() 函数获取键值对列表

由于字典有键与值,所以使用 for 循环遍历字典时,需要使用两个临时变量,用于在每次循环中存储键值对的键与值,例如:k 与 v、key 与 value

并且使用for循环时,要对字典变量调用 items() 函数进行处理,该函数会返回字典的键值对列表

>>> users = {
...     'username' : 'sean',
...     'age' : '24',
...     'color' : 'yellow',
...     }
>>> for key, value in users.items():
...     print("Key: " + key)
...     print("Value: " + value + "\n")
... 
Key: username
Value: sean

Key: age
Value: 24

Key: color
Value: yellow

如果值有数字的话,输出时最好将其通过 str() 函数转换为 字符串输出,否则会报类型错误

>>> users = {
...     'username' : 'sean',
...     'age' : 24,
...     'color' : 'yellow',
...     }
>>> for key, value in users.items():
...     print("Key: " + key)
...     print("Value: " + str(value) + "\n")
... 
Key: username
Value: sean

Key: age
Value: 24

Key: color
Value: yellow

注意:遍历字典时,items() 函数返回的键值对顺序可能与字典的存储顺序不同,进而导致遍历输出的字典顺序与其存储顺序不同。因为Python不关心键值对的存储顺序,只关注键与值直接的关联关系

遍历字典中的所有键

当只需要遍历字典中所有的键时,只需要将 items() 函数 换为 keys() 函数

key() 函数会以列表的形式返回该字典所有的键

但由于遍历字典时,默认是遍历字典所有的键,所以在 for循环 中,直接指定 字典名 即可,不需要再对字典变量调用任何函数

即,若对字典变量显式地调用 keys() 函数,与对字典变量不调用任何函数的效果一样因为默认遍历字典所有的键

由于只需要键的信息,所以只需要一个临时变量

>>> colors = {
...     'Bob' : '1',
...     'Jack' : '2',
...     'Kevin' : '3',
...     }
>>> for key in colors:
...     print(key)
... 
Bob
Jack
Kevin
>>> for key in colors.keys():
...     print(key)
... 
Bob
Jack
Kevin

遍历字典中所有的值

与遍历所有的键类似,遍历所有的值时,字典变量调用的函数是 values()

value()函数 返回一个值列表,不包含任何键

写for循环时,也只需要一个临时变量即可

>>> colors = {
...     'Bob' : '1',
...     'Jerry' : '2',
...     'Kevin' : '3',
...     }
>>> for value in colors.values():
...     print(value)
... 
1
2
3

values()函数 默认是不处理重复的值,若需要去除重复的值,可以将返回的值列表使用 set()函数 转换为集合

>>> numbers = {
...     'Bob' : '1',
...     'Jerry' : '1',
...     'Kevin' : '3',
...     }
>>> for value in set(numbers.values()):
...     print(value)
... 
3
1

从此处也能发现,values()函数返回的值列表的顺序也并非字典定义时值的顺序

字典与列表、字典结合

字典列表

在列表中包含大量的字典,这种列表中的每个元素都是一个字典,而其中每个字典都包含特定对象的众多信息

>>> lists = []
>>> for i in range(0, 10):
...     people = {'names' : 'Sean', 'age' : 24}
...     lists.append(people)
... 
>>> for i in lists[:5]:
...     print(i)
... 
{'names': 'Sean', 'age': 24}
{'names': 'Sean', 'age': 24}
{'names': 'Sean', 'age': 24}
{'names': 'Sean', 'age': 24}
{'names': 'Sean', 'age': 24}
>>> type(lists)
<class 'list'>
>>> for i in lists[:5]:
...     for k in i.values():
...             print(k)
... 
Sean
24
Sean
24
Sean
24
Sean
24
Sean
24

可以看出,lists 里面的每个元素都是 字典

在字典中存储列表

当要在字典中将一个键与多个值关联时,就要在字典中嵌套一个列表

在定义字典时,与键相关联的值 是一个列表

所以访问该列表时,需要指名 字典名相关联的键名

并且可以对该列表进行遍历

>>> person = {
...     'names' : 'Sean',
...     'colors' : ['red', 'yellow', 'blue'],
...     }
>>> print(person['colors'])
['red', 'yellow', 'blue']
>>> print(person['colors'][0])
red
>>> for i in person['colors']:
...     print(i)
... 
red
yellow
blue

若字典中每个键相关联的值都是列表,若要对每个列表都遍历:

>>> colors = {
...     'Bob' : ['red', 'blue'],
...     'Kevin' : ['yellow', 'black'],
...     'David' : ['white', 'green'],
...     }
>>> for k, v in colors.items():
...     print(k + " likes :")
...     for i in v:
...             print("\t" + i)
... 
Bob likes :
	red
	blue
Kevin likes :
	yellow
	black
David likes :
	white
	green

在字典中存储字典

字典中的键不能是字典,但与键相关联的值可以是字典

应注意,每个键对应的字典定义完后,右花括号后面不要遗忘 逗号

需要两个临时变量,k 存储 大字典的键,v存储 与键相关联的字典

>>> persons = {
...     'Bob' : {
...             'name' : 'Bob',
...             'age' : '19',
...             },
...     'David' : {
...             'name' : 'David',
...             'age' : '24',
...             },
...     }
>>> for k, v in persons.items():
...     print(v['name'] + "\t" + v['age'])
... 
Bob	19
David	24

注意:在使用这种字典嵌套字典的结构时,为了编写代码更加方便,最好内部的字典的结构要都相同

posted @ 2021-02-05 20:41  SeanSiyang  阅读(64)  评论(0编辑  收藏  举报