Python 字典简介
Python 中的变量可以存储各种数据类型。 之前,你已了解可以存储字符串和数字:
name = 'Earth'
moons = 1
尽管此方法确实适用于少量数据,但处理相关数据时,可能会变得越来越复杂。 想象一下,你想存储有关地球卫星和木星卫星的信息。
earth_name = 'Earth'
earth_moons = 1
jupiter_name = 'Jupiter'
jupiter_moons = 79
请注意,我们复制了具有不同前缀的变量。 这种重复会变得难以处理。 由于你会经常使用相关的数据集,例如不同城市不同月份的平均降雨量,因此将这些变量存储为单独的值并不是一个可行的选项。 可以改用 Python 字典。
Python 字典使你能够使用相关的数据集。 字典是键/值对的集合。 可以将其想象为容器内的一组变量,其中键是变量的名称,值是存储在其中的值。
创建字典
Python 使用大括号 ({ }
) 和冒号 (:
) 来表示字典。 可以创建一个空字典,之后再添加值,也可以在创建时进行填充。 每个键/值用冒号分隔,每个键的名称以字符串字面量形式包含在引号中。 由于键是字符串字面量,因此可以使用任何适当的名称来描述值。
让我们创建一个字典来存储地球的名称,以及地球具有的卫星数量:
planet = {
'name': 'Earth',
'moons': 1
}
你有两个键,'name'
和 'moons'
。 每个键的行为方式都与变量的行为方式非常相似:它们具有唯一的名称,并且存储一个值。 但是,它们包含在一个名为 planet
的更大变量中。
与常规变量一样,你需要确保使用正确的数据类型。 在前面示例中的 moons
的值 1
中,由于你想要使用整数,因此未在数字两边加上引号。 如果使用了 '1'
,Python 会将此变量视为字符串,这会影响执行计算的能力。
与常规变量不同,键名不需要遵循 Python 的标准命名规则。 可以使用键名来使代码更具描述性。
读取字典值
可以读取字典中的值。 字典对象具有 get
方法,可以使用该方法通过键访问值。 如果要打印 name
,可以使用以下代码:
print(planet.get('name'))
Earth
正如你所料,访问字典中的值是一项常见操作。 幸运的是,有一个快捷方式。 可以将键传递到方括号表示法 ([ ]
)。 此方法使用的代码比 get
少,并且大多数程序员都使用这种语法。 可以使用以下代码重写前面的示例:
# planet['name'] is identical to using planet.get('name')
print(planet['name'])
Earth
尽管 get
和方括号 ([ ]
) 在检索项时通常行为相同,但存在一个关键区别。 如果键不可用,get
将返回 None
,[ ]
将引发 KeyError
。
wibble = planet.get('wibble') # Returns None
wibble = planet['wibble'] # Throws KeyError
修改字典值
还可以使用 update
方法修改字典对象内的值。 此方法接受字典作为参数,并使用你提供的新值更新任何现有值。 如果要更改 planet
字典的 name
,可以使用以下代码,例如:
planet.update({'name': 'Makemake'})
# No output: name is now set to Makemake.
与使用方括号 ([ ]
) 快捷方式读取值类似,你可以使用该相同的快捷方式来修改值。 语法的主要区别在于将使用 =
(有时称为赋值运算符)来提供新值。 若要重写前面的示例以更改名称,可以使用以下代码:
planet['name'] = 'Makemake'
# No output: name is now set to Makemake.
使用 update
的主要优势是能够在一次操作中修改多个值。 接下来的两个示例在逻辑上相同,但语法不同。 你可以随意使用你认为最合适的任何语法。 大多数开发人员选择使用方括号来更新单个值。
以下示例对 planet
变量进行相同的编辑,更新名称和卫星。 请注意,通过使用 update
,你对函数进行了一次调用,而使用方括号涉及两次调用。
使用更新:
planet.update({
'name': 'Jupiter',
'moons': 79
})
使用方括号:
planet['name'] = 'Jupiter'
planet['moons'] = 79
添加和删除键
初始化字典时,无需创建所有键。 事实上,无需创建任何键! 每当需要创建新键时,都可以像分配现有键一样分配它。
假设你要更新 planet
以包含以天为单位的轨道周期:
planet['orbital period'] = 4333
# planet dictionary now contains: {
# name: 'jupiter'
# moons: 79
# orbital period: 4333
# }
重要
与 Python 中的其他所有内容一样,键名区分大小写。 因此,'name'
和 'Name'
在 Python 字典中被视为两个单独的键。
若要删除键,请使用 pop
。 pop
返回值并从字典中删除键。 若要删除 orbital period
,可以使用以下代码:
planet.pop('orbital period')
# planet dictionary now contains: {
# name: 'jupiter'
# moons: 79
# }
复杂数据类型
字典能够存储任何类型的值,包括其他字典。 这样,你可以根据需要对复杂数据进行建模。 想象一下,你需要存储 planet
的直径,该直径可以在其赤道或两极附近测量。 你可以在 planet
内创建另一个字典来存储此信息:
# Add address
planet['diameter (km)'] = {
'polar': 133709,
'equatorial': 142984
}
# planet dictionary now contains: {
# name: 'Jupiter'
# moons: 79
# diameter (km): {
# polar: 133709
# equatorial: 142984
# }
# }
若要检索嵌套字典中的值,请将方括号链接在一起,或调用 get
。
print(f'{planet["name"]} polar diameter: {planet["diameter (km)"]["polar"]}')
Jupiter polar diameter: 133709