Python 字典|Python 主题月

946 阅读5分钟

本文正在参加「Python主题月」,详情查看 活动链接

本文将学习将相关信息关联起来的 Python 字典,以及如何访问和修改字典中的信息。

  • 字典中存储的信息量几乎不受限制,我们将演示如何遍历字典中的数据。

一个简单的字典

  • 一个简单的字典,存储了有关外星人的信息:
alien_0 = {'color': 'green', 'points': 5}

使用字典

  • 在 Python 中,字典是一系列键值对。
  • 每一个键都与一个值相关联,可以使用键来访问值。
  • 与键相关联的值可以是数、字符串、列表乃至字典。
  • 实际上,可以将任何 Python 对象用作字典中的值。

访问字典中的值

alien_0 = {'color': 'green', 'points': 5}
print(alien_0['color'])
print(alien_0['points'])
  • 可以访问外星人 alien_0 的颜色和分数。如果玩家射杀了这个外星人,可以获得相应的分数:
alien_0 = {'color': 'green', 'points': 5}
new_points = alien_0['points']
print(f"You just earned {new_points} points!")

添加键值对

  • 字典是一种动态结构,可随时在其中添加键值对。
  • 要添加键值对,可依次指定字典名、用方括号括起来的键和相关联的值。
  • 下面向字典中添加两项信息:外星人的 x 坐标和 y 坐标:
alien_0 = {'color': 'green', 'points': 5}

alien_0['x_position'] = 0
alien_0['y_position'] = 25

print(alien_0)

先创建一个空字典

  • 在空字典中添加键值对有时候可提供便利,而有时候必须这样做。为此,可先使用一对空花括号定义一个字典,再分行添加各个键值对。
alien_0 = {}

alien_0['color'] = 'green'
alien_0['points'] = 5

print(alien_0)
  • 使用字典来存储用户提供的数据或在编写能自动生成大量键值对的代码时,通常需要先定义一个空字典。

修改字典中的值

  • 要修改字典中的值,可依次指定字典名、用方括号括起的键,以及与该键相关联的新值。
alien_0 = {}

alien_0['color'] = 'green'

print(f"The alien is {alien_0['color']}.")

alien_0['color'] = 'yellow'

print(f"The alien is {alien_0['color']}.")

删除键值对

  • 对于字典中不再需要的信息,可使用 del 语句将相应的键值对彻底删除。
  • 使用 del 语句时,必须指定字典名和要删除的键。
alien_0 = {'color': 'green', 'points': 5}
print(alien_0)

del alien_0['points']
print(alien_0)

由类似对象组成的字典

  • 在前面的示例中,字典存储的是一个对象(游戏中的一个外星人)的多种信息,但你也可以使用字典来存储众多对象的同一种信息。
favorite_language = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}
  • 一种不错的做法是,在最后一个键值对后面也加上逗号,为以后在下一行添加键值对做好准备。
  • 给定调查者的名字,可以很轻松的获取他最喜欢的编程语言:
favorite_language = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

language = favorite_language['sarah'].title()

print(f"Sarah's favorite language is {language}")

使用 get() 来访问值

  • 使用放在方括号内的键从字典中获取感兴趣的值时,可能会引发问题:如果指定的键不存在就会出错。
  • 但就字典而言,可使用方法 get() 在指定的键不存在时返回一个默认值,从而避免这样的错误。
  • 方法 get() 的第一个参数用于指定键,是必不可少的;第二个参数为指定的键不存在时要返回的值,是可选的:
alien_0 = {'color': 'green', 'speed': 'slow'}
point_value = alien_0.get('points', 'No point value assigned.')
print(point_value)
  • 调用 get() 时,如果没有指定第二个参数且指定的键不存在,Python 将返回值 None

遍历字典

  • 字典可用于以各种方式存储信息,因此有多种遍历方式:可遍历字典的所有键值对,也可仅遍历键或值。

遍历所有键值对

  • 下面的字典存储一名用户的用户名、名和姓:
user_0 = {
    'username': 'efermi',
    'first': 'enrico',
    'last': 'fermi',
}
  • 使用 for 循环来遍历这个字典中:
user_0 = {
    'username': 'efermi',
    'first': 'enrico',
    'last': 'fermi',
}

for key, value in user_0.items():
    print(f"\nKey: {key}")
    print(f"Value: {value}")

遍历字典中的所有键

  • 在不需要使用字典中的值时,方法 keys() 很有用。
favorite_language = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

for name in favorite_language.keys():
    print(name.title())

按特定顺序遍历字典中的所有键

  • 要以特定顺序返回元素,一种办法是在 for 循环中对返回的键进行排序。
  • 为此,可使用函数 sorted() 来获得按特定顺序排列的键列表的副本
favorite_language = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

for name in sorted(favorite_language.keys()):
    print(f"{name.title()}, thank you for taking the poll.")

遍历字典中的所有值

  • 如果主要对字典包含的值感兴趣,可使用方法 values() 来返回一个值列表,不包含任何键。
favorite_language = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

print("The following languages have been mentioned:")

for language in favorite_language.values():
    print(language.title())
  • 这种做法提取字典中所有的值,而没有考虑是否重复
  • 为剔除重复项,可使用集合 set。集合中的每个元素都必须是独一无二的:
favorite_language = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
}

print("The following languages have been mentioned:")

for language in set(favorite_language.values()):
    print(language.title())
  • 可使用一对花括号直接创建集合,并在其中用逗号分隔元素:
languages = {'python', 'ruby', 'python', 'c'}
print(languages)

集合字典很容易混淆,因为它们都是用一对花括号定义的。当花括号内没有键值对时,定义的很可能是集合。不同于列表字典,集合不会以特定的顺序存储元素。

嵌套

  • 有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。

字典列表

  • 如何管理成群结队的外星人?
alien_0 = {'color': 'green', 'points': 5}
alien_1 = {'color': 'yellow', 'points': 10}
alien_2 = {'color': 'red', 'points': 15}

aliens = [alien_0, alien_1, alien_2]

for alien in aliens:
    print(alien)

在字典中存储列表

  • 有时候,需要将列表存储在字典中,而不是将字典存储在列表中。
  • 在下面的示例中,存储了比萨的两方面信息:外皮类型和配料列表。
pizza = {
    'crust': 'thick',
    'toppings': ['mushrooms', 'extra cheese'],
}

print(f"You ordered a {pizza['crust']}-crust pizza "
        "with the following toppings:")

for topping in pizza['toppings']:
    print("\t" + topping)
  • 每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。

在字典中存储字典

users = {
    'aeinstein': {
        'first': 'albert',
        'last': 'einstein',
        'location': 'princeton',
    },
    'mcurie': {
        'first': 'marie',
        'last': 'curie',
        'location': 'paris',
    },
}

for username, user_info in users.items():
    print(f"\nUsername: {username}")
    full_name = f"{user_info['first']} {user_info['last']}"
    location = user_info['location']
    print(f"\tFull name: {full_name.title()}")
    print(f"\tLocation: {location.title()}")