字典是一种可变容器,且可存储任意类型对象。字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:d = {key1 : value1, key2 : value2 }键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。

字典的基本概念

字典 dictionary ,在一些编程语言中也称为 hashmap ,是一种由键值对组成的数据结构。

顾名思义,我们把键想象成字典中的单词,值想象成词对应的定义,那么——

一个词可以对应一个或者多个定义,但是这些定义只能通过这个词来进行查询。

Python 使用key: value这样的结构来表示字典中的元素结构。

字典

基本操作

空字典

Python 使用 {} 或者 dict() 来创建一个空的字典:

a = {}
type(a)
# 运行结果: dict

a = dict()
type(a)
# 运行结果: dict

插入键值

有了dict之后,可以用索引键值的方法向其中添加元素,也可以通过索引来查看元素的值:

a["one"] = "this is number 1"
a["two"] = "this is number 2"
a

# 运行结果:
# {'one': 'this is number 1', 'two': 'this is number 2'}

查看键值

a['one']

# 运行结果:
# 'this is number 1'

更新键值

a["one"] = "this is number 1, too"
a

# 运行结果: {'one': 'this is number 1, too', 'two': 'this is number 2'}

初始化字典

可以看到,Python使用key: value这样的结构来表示字典中的元素结构,事实上,可以直接使用这样的结构来初始化一个字典:

b = {'one': 'this is number 1', 'two': 'this is number 2'}
b['one']

#运行结果: 'this is number 1'

字典没有顺序

当我们 print 一个字典时,Python并不一定按照插入键值的先后顺序进行显示,因为字典中的键本身不一定是有序的。

因此,Python中不能用支持用数字索引按顺序查看字典中的值,而且数字本身也有可能成为键值,这样会引起混淆:

# 会报错
a[0]

键必须是不可变的类型

出于hash的目的,Python中要求这些键值对的必须是不可变的,而值可以是任意的Python对象。

一个表示近义词的字典:

synonyms = {}
synonyms['mutable'] = ['changeable', 'variable', 'varying', 'fluctuating',
                       'shifting', 'inconsistent', 'unpredictable', 'inconstant',
                       'fickle', 'uneven', 'unstable', 'protean']
synonyms['immutable'] = ['fixed', 'set', 'rigid', 'inflexible', 
                         'permanent', 'established', 'carved in stone']
synonyms

运行结果:

{'immutable': ['fixed',
  'set',
  'rigid',
  'inflexible',
  'permanent',
  'established',
  'carved in stone'],
 'mutable': ['changeable',
  'variable',
  'varying',
  'fluctuating',
  'shifting',
  'inconsistent',
  'unpredictable',
  'inconstant',
  'fickle',
  'uneven',
  'unstable',
  'protean']}

字典嵌套

# 定义四个字典
e1 = {'mag': 0.05, 'width': 20}
e2 = {'mag': 0.04, 'width': 25}
e3 = {'mag': 0.05, 'width': 80}
e4 = {'mag': 0.03, 'width': 30}
# 以字典作为值传入新的字典
events = {500: e1, 760: e2, 3001: e3, 4180: e4}
events

运行结果:

{500: {'mag': 0.05, 'width': 20},
 760: {'mag': 0.04, 'width': 25},
 3001: {'mag': 0.05, 'width': 80},
 4180: {'mag': 0.03, 'width': 30}}

键(或者值)的数据类型可以不同:

people = [
    {'first': 'Sam', 'last': 'Malone', 'name': 35},
    {'first': 'Woody', 'last': 'Boyd', 'name': 21},
    {'first': 'Norm', 'last': 'Peterson', 'name': 34},
    {'first': 'Diane', 'last': 'Chambers', 'name': 33}
]
people

运行结果:

[{'first': 'Sam', 'last': 'Malone', 'name': 35},
 {'first': 'Woody', 'last': 'Boyd', 'name': 21},
 {'first': 'Norm', 'last': 'Peterson', 'name': 34},
 {'first': 'Diane', 'last': 'Chambers', 'name': 33}]

使用 dict 初始化字典

除了通常的定义方式,还可以通过 dict() 转化来生成字典:

inventory = dict(
    [('foozelator', 123),
     ('frombicator', 18), 
     ('spatzleblock', 34), 
     ('snitzelhogen', 23)
    ])
inventory

运行结果:

{'foozelator': 123, 'frombicator': 18, 'snitzelhogen': 23, 'spatzleblock': 34}

利用索引直接更新键值对:

inventory['frombicator'] += 1
inventory

运行结果:

{'foozelator': 123, 'frombicator': 19, 'snitzelhogen': 23, 'spatzleblock': 34}

适合做键的类型

在不可变类型中,整数和字符串是字典中最常用的类型;而浮点数通常不推荐用来做键,原因如下:

data = {}
data[1.1 + 2.2] = 6.6
# 会报错
data[3.3]

事实上,观察data的值就会发现,这个错误是由浮点数的精度问题所引起的:

data

# 运行结果: {3.3000000000000003: 6.6}

有时候,也可以使用元组作为键值,例如,可以用元组做键来表示从第一个城市飞往第二个城市航班数的多少:

connections = {}
connections[('New York', 'Seattle')] = 100
connections[('Austin', 'New York')] = 200
connections[('New York', 'Austin')] = 400

元组是有序的,因此 ('New York', 'Austin')('Austin', 'New York') 是两个不同的键:

字典方法

get 方法

之前已经见过,用索引可以找到一个键对应的值,但是当字典中没有这个键的时候,Python会报错,这时候可以使用字典的 get 方法来处理这种情况,其用法如下:

d.get(key, default = None)

返回字典中键 key 对应的值,如果没有这个键,返回 default 指定的值(默认是 None )。

a = {}
a["one"] = "this is number 1"
a["two"] = "this is number 2"

# 索引不存在的键值会报错
a["three"]

# 改用get方法
print (a.get("three"))  #返回None

# 指定默认值参数
a.get("three", "undefined") #返回'undefined'

pop 方法删除元素

pop 方法可以用来弹出字典中某个键对应的值,同时也可以指定默认参数:

a = {'one': 'this is number 1', 'two': 'this is number 2'}
a.pop("two")  #返回'this is number 2'

a # 返回 {'one': 'this is number 1'}

弹出不存在的键值:

a.pop("two", 'not exist')

# 运行结果: 'not exist'

与列表一样,del 函数可以用来删除字典中特定的键值对,例如:

del a["one"]
a

# 返回: {}

update方法更新字典

之前已经知道,可以通过索引来插入、修改单个键值对,但是如果想对多个键值对进行操作,这种方法就显得比较麻烦,好在有 update 方法:

d.update(newd)

将字典newd中的内容更新到d中去。

person = {}
person['first'] = "Jmes"
person['last'] = "Maxwell"
person['born'] = 1831
print (person)

#运行结果:{'born': 1831, 'first': 'Jmes', 'last': 'Maxwell'}

把'first'改成'James',同时插入'middle'的值'Clerk':

person_modifications = {'first': 'James', 'middle': 'Clerk'}
person.update(person_modifications)
print (person)

# 运行结果: {'born': 1831, 'first': 'James', 'last': 'Maxwell', 'middle': 'Clerk'}

in查询字典中是否有该键

barn = {'cows': 1, 'dogs': 5, 'cats': 3}

# in 可以用来判断字典中是否有某个特定的键:
'chickens' in barn #返回 False

'cows' in barn  #返回 True

keys 方法,values 方法和items 方法

d.keys()   #返回一个由所有键组成的列表

d.values() #返回一个由所有值组成的列表

d.items()  #返回一个由所有键值对元组组成的列表

实例:

barn.keys() 
# dict_keys(['cows', 'cats', 'dogs'])

barn.values()
# dict_values([1, 3, 5])

barn.items()
# dict_items([('cows', 1), ('cats', 3), ('dogs', 5)])

博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/RePython6.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 06 月 10 日
如果觉得我的文章对你有用,请随意赞赏