字典

Python
作者

yangjh

发布日期

November 25, 2022

字典(Dictionary) 是Python中的一种数据类型,用来存储键(key)值(value)对。字典数据能够使用键名快速取回、添加、删除、编辑值。字典和其他语言中的数组(array)或者哈希表(hash)非常相似。字典是可变(mutable)序列。

创建字典

与创建列表类似,创造字典的常用方法也有多种。只了解和掌握单一的创建方法并不能应对实际工作需求。

创造字典的常用方式

  • 使用{},例如 {"id":2,"name":"小明"}
  • 使用dict()函数(也叫构造函数),例如dict(name='小明', id=2)
  • 使用字典推导式,{key:value for key,value in iterable (if condition) }

字典键名和值的要求

  • 键名数据类型必须是不可变的。通常为字符串。
  • 字典中的键名必须是唯一的。
  • 值可以是任意类型。

使用{}创建字典

friends = {
'tom'   : '66666666',
'jerry' : '88888888'
}

使用花括弧 {}就可创建字典。字典中的每一个项目都由键名、冒号:和值组成,多个项目之间用逗号,分割。

使用dict函数和键值对创建字典

dict(name='小明', age=19, gender='男')
"""
{'name': '小明', 'age': 19, 'gender': '男'}
"""

这种方式代码量小,但键必须都是字符串。

使用dict函数和列表组合创建字典

name = ['小明','小丽']
gender = ['男','女']
dict(zip(name,gender))
"""
{'小明': '男', '小丽': '女'}
"""

使用字典推导式创建字典

name = ['小明','小丽','小强']
gender = ['男','女','男']
{ name:gender for name,gender in zip(name,gender) if gender=='男'}
"""
{'小明': '男', '小强': '男'}
"""

字典推导式的语法如下:

D = { key: value for key, value in iterable (if 语句) }

字典推导式的优势在于它可以包含 if 语句,所以在筛选数据上面有很大的灵活性。

获取、修改和添加字典元素

获取字典内容

dictionary_name['key']

例如:

>>> friends['tom']
'66666666'

如果字典中存在指定的键名,则返回对应的值,否则抛出键名异常。

添加和编辑字典项目

dictionary_name['newkey'] = 'newvalue'

例如:

>>> friends['bob'] = '99999999'
>>> friends
{'jerry': '88888888', 'bob': '99999999', 'tom': '66666666'}

删除字典项目

del dictionary_name['key']

例如:

>>>  del friends['bob']
>>>  friends
{'tom': '66666666', 'jerry': '88888888'}

遍历字典

数据分析中经常使用需要遍历字典,查找符合某个条件的内容。

遍历字典key

dict1 = {
    '小明': 98,
    '小兰': 86,
    '小红': 89,
}
for key in dict1:
    print(key)
"""
小明 小兰 小红
"""
for key in dict1.keys():
    print(key)
"""
小明 小兰 小红
"""

遍历字典value

dict1 = {
    '小明': 98,
    '小兰': 86,
    '小红': 89,
}
for key in dict1.keys():
    print(key)
"""
小明 小兰 小红
"""

遍历字典key和value

dict1 = {
    '小明': 98,
    '小兰': 86,
    '小红': 89,
}
for key, value in dict1.items():
    print(F'Key: {key}, Value: {value};')
"""
Key: 小明, Value: 98;
Key: 小兰, Value: 86;
Key: 小红, Value: 89;
"""
for kv in dict1.items():
    print ('kv is : ',kv)
"""
kv is :  ('小明', 98)
kv is :  ('小兰', 86)
kv is :  ('小红', 89)
"""

字典比较

判断两个字典中是否包含相同项目

使用 ==!= 操作符判断字典是否包含相同的项目。

>>> d1 = {"mike":41, "bob":3}
>>> d2 = {"bob":3, "mike":41}
>>> d1 == d2
True
>>> d1 != d2
False
>>>

不能使用其它的关系操作符(< , > , >= , <= )比较字典类型变量。

字典常用方法

Python提供了多个内置的方法,用来操作字典,常用方法见下表:

方法名 方法用途
popitem() 返回并移除字典中的任意项目
clear() 删除字典中的所有项目
keys() 以元组的形式获得字典的键名
values() 以元组的形式获得字典的值
get(key) 获得指定键名对应的值
pop(key) 移除指定键名的项目
>>> friends = {'tom': '111-222-333', 'bob': '888-999-666', 'jerry': '666-33-111'}

>>> friends.popitem()
('tom', '111-222-333')

>>> friends.clear()

>>>  friends
{}

>>> friends = {'tom': '111-222-333', 'bob': '888-999-666', 'jerry': '666-33-111'}

>>> friends.keys()
dict_keys(['tom', 'bob', 'jerry'])

>>> friends.values()
dict_values(['111-222-333', '888-999-666', '666-33-111'])

>>> friends.get('tom')
'111-222-333'

>>> friends.get('mike', 'Not Exists')
'Not Exists'

>>> friends.pop('bob')
'888-999-666'

>>> friends
{'tom': '111-222-333', 'jerry': '666-33-111'}

字典排序

字典的排序,可以使用sorted()函数,语法如下:

sorted(iterable,key,reverse)
  1. iterable表示可以迭代的对象,例如可以是dict.items()dict.keys()等;
  2. key是一个函数,用来选取参与比较的元素;
  3. reverse则是用来指定排序是倒序还是顺序,reverse=true则是倒序,reverse=false时则是顺序,默认时reverse=false

sorted函数按key值对字典排序

直接使用sorted(d.keys())就能按key值对字典排序,这里是按照顺序对key值排序的,如果想按照倒序排序的话,则只要将reverse置为true即可。

dd = {'borisakunin': 4691, 'doctor_liza': 3046, 'tareeva': 2970, 'cheger': 2887, 'karial': 2717, 'snorapp': 2707, 'masha_koroleva': 2683, 'elladkin': 2616, 'samoleg': 2597}
>>> sorted(dd.keys())
['borisakunin', 'cheger', 'doctor_liza', 'elladkin', 'karial', 'masha_koroleva', 'samoleg', 'snorapp', 'tareeva']
>>> sorted(dd.keys(),reverse=True)
['tareeva', 'snorapp', 'samoleg', 'masha_koroleva', 'karial', 'elladkin', 'doctor_liza', 'cheger', 'borisakunin']

sorted函数按value值对字典排序

要对字典的value排序则需要用到key参数,常使用lambda表达式的方法,如下:

>>> sorted(dd.items(),key=lambda item:item[1])
[('samoleg', 2597), ('elladkin', 2616), ('masha_koroleva', 2683), ('snorapp', 2707), ('karial', 2717), ('cheger', 2887), ('tareeva', 2970), ('doctor_liza', 3046), ('borisakunin', 4691)]

>>> sorted(dd.items(),key=lambda item:item[1],reverse=True)
[('borisakunin', 4691), ('doctor_liza', 3046), ('tareeva', 2970), ('cheger', 2887), ('karial', 2717), ('snorapp', 2707), ('masha_koroleva', 2683), ('elladkin', 2616), ('samoleg', 2597)]

这里的dd.items()实际上是将dd转换为可迭代对象,items()方法将字典的元素转化为了元组,而这里key参数对应的lambda表达式的意思则是选取元组中的第二个元素作为比较对象,如果写作key=lambda item:item[0]的话则是选取第一个元素作为比较对象,也就是key值作为比较对象。

注意排序函数sorted()返回值是一个list,而原字典中的名值对被转换为了list中的元组。

参考文献

  1. 内置类型 — Python 3.10.7 文档
回到顶部