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 字典中被视为两个单独的键。

若要删除键,请使用 poppop 返回值并从字典中删除键。 若要删除 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