在Python中,字典是一系列键值对,每个都与一个值相关联,可以使用键来访问值.与键相关联的值可以是数,字符串,列表乃至字典.
在Python中,字典用放在花括号({})中的一系列键值对表示

  1. alien_0 = {'color':'green','point':5}

键值对是两个相关联的值.指定键时,python将返回与之相关联的值.键和值之间用冒号间隔,而键值对之间用逗号分隔.在字典中,想存储多少键值对都可以,最简单的字典只有一个键值对.

  1. alien_0 = {'color':'green'}

访问字典中的值

  1. alien_0 = {'color':'green','point':5}
  2. print(alien_0['color'])

image.png

添加键值对

字典是一种动态结构,可随时在其中添加键值对

  1. # 字典
  2. alien_0 = {'color':'green','point':5}
  3. print(alien_0)
  4. alien_0['x_position'] = 0
  5. alien_0['y_position'] = 25
  6. print(alien_0)

image.png

先创建一个空字典

  1. alien_0 = {}
  2. alien_0['color'] = 'green'
  3. alien_0['points'] = 5
  4. print(alien_0)

image.png

修改字典的值

  1. alien_0 = {'color' : 'green'}
  2. alien_0['color'] = 'yellow'

删除键值对

  1. alien_0 = {'color':'green','points':5}
  2. print(alien_0)
  3. del alien_0['points']
  4. print(alien_0)

image.png

由类似对象组成的字典

  1. favorite_language = {
  2. 'jen':'python',
  3. 'sarah':'c',
  4. 'edward':'ruby',
  5. 'phil':'python',
  6. }

使用get()来访问值

使用如alien_0['color']这样的方法来从获取值时,可能会引发问题:如果指定的键不存在就会出错.
如下:

  1. favorite_language = {
  2. 'jen':'python',
  3. 'sarah':'c',
  4. 'edward':'ruby',
  5. 'phil':'python',
  6. }
  7. print(favorite_language['bill'])

image.png
就字典而言,可使用方法get()在指定的键不存在时返回一个默认值,从而避免这样的错误.
方法get()的第一个参数用于指定键,是必不可少的;第二个参数为指定的键不存在时要返回的值,是可选的(为空将返回值None):

  1. aline_0 = {'color':'green', 'spped':'slow'}
  2. point_value = aline_0.get('point','No point value assigned.')
  3. print(point_value)

image.png
如果字典中有键’point’,将获得与之相关联的值;如果没有,将获得指定的默认值,不会引发错误. :::tips 如果指定的键有可能不存在,应考虑使用方法get(),而不要使用方括号表示法 :::

遍历字典

遍历所有键值对

  1. user_0 = {
  2. 'username':'efermi',
  3. 'first':'enrico',
  4. 'last':'fermi',
  5. }
  6. for key,value in user_0.items(): # for a,b in user_0 items():也可以
  7. print(f"\nKey:{key}")
  8. print(f"Value:{value}")

image.png

遍历字典中的所有键

  1. favorite_languages = {
  2. 'jen':'python',
  3. 'sarah':'c',
  4. 'edward':'ruby',
  5. 'phil':'python',
  6. }
  7. for name in favorite_languages.keys():
  8. print(name.title())

遍历字典时,会默认遍历所有键, 使用 for name in favorite_languages:输出将不变,但显示使用keys()可让代码更容易理解

按特定顺序遍历字典中的所有键(python3.7)

  1. favorite_language = {
  2. 'jen':'python',
  3. 'sarah':'c',
  4. 'edward':'ruby',
  5. 'phil':'python',
  6. }
  7. for name in sorted(favorite_language.keys()):
  8. print(f'{name.title()},thank you for taking the poll.')

image.png

遍历字典中的所有值

  1. favorite_language = {
  2. 'jen':'python',
  3. 'sarah':'c',
  4. 'edward':'ruby',
  5. 'phil':'python',
  6. }
  7. print("The following languages have been mentioned:")
  8. for language in favorite_language.values():
  9. print(language.title())

image.png
为剔除其中的重复项,可使用集合(set),集合中的每个元素都必须是独一无二的:

  1. favorite_language = {
  2. 'jen':'python',
  3. 'sarah':'c',
  4. 'edward':'ruby',
  5. 'phil':'python',
  6. }
  7. print("The following languages have been mentioned:")
  8. for language in set(favorite_language.values()):
  9. print(language.title())

image.png :::info 可使用一对花括号直接创建集合,并在其中用逗号分隔元素:
>>> lnaguages = {‘python’,’ruby’,’python’,’c’}
>>> lnaguages
{‘c’, ‘ruby’, ‘python’}
集合和字典很容易混淆,因为他们都是用一对花括号定义的.当花括号内没有键值对时,定义的很可能是集合.不同于列表与字典,集合不会以特定的顺序存储元素 :::

嵌套

字典列表

  1. alien_0 = {'color':'green','points':5}
  2. alien_1 = {'color':'yellow','points':10}
  3. alien_2 = {'color':'green','points':15}
  4. aliens = [alien_0,alien_1,alien_2]
  5. for alien in aliens:
  6. print(alien)

image.png

  1. #创建一个用于存储外星人的空列表
  2. aliens = []
  3. #创建30个绿色的外星人
  4. for alien_number in range(30):
  5. new_alien = {'color':'green','point':5,'speed':'slow'}
  6. aliens.append(new_alien)
  7. #显示前5个外星人
  8. for alien in aliens[:5]:
  9. print(alien)
  10. print("...")
  11. #显示创建了多少个外星人
  12. print(f"Total nume of aliens:{len(aliens)}")

image.png
必要时,可使用for循环和if语句来修改某些外星人的颜色

  1. #创建一个用于存储外星人的空列表
  2. aliens = []
  3. #创建30个绿色的外星人
  4. for alien_number in range(30):
  5. new_alien = {'color':'green','point':5,'speed':'slow'}
  6. aliens.append(new_alien)
  7. for alien in aliens[:3]:
  8. if alien['color'] == 'green':
  9. alien['color'] = 'yellow'
  10. alien['point'] = 10
  11. alien['speed'] = 'medium'
  12. #显示前5个外星人
  13. for alien in aliens[:5]:
  14. print(alien)
  15. print("...")
  16. #显示创建了多少个外星人
  17. print(f"Total nume of aliens:{len(aliens)}")

在字典中存储列表

# 存储所点披萨的信息
pizza = {
    'crust':'thick',
    'toppings':['mushrooms','extra chess'],
}

# 概述所点的披萨
print(f"you ordered a {pizza['crust']}-crust pizza "
"with the following toppings:")

for topping in pizza['toppings']:
    print("\t" + topping)

image.png

如果函数调用print()中的字符串很长,可以在合适的位置分行.只需要在每行末尾都加上引号,同时对于除第一行以外的其他各行,都在行首加上引号并缩进

在字典中存储字典

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}")
    print(f"\tLocation:{location}")

image.png :::tips 清注意,表示每位用户的字典都具有相同的结构.虽然Python并没有这样的要求,但这使得嵌套的字典处理起来更容易.倘若每位用户的字典都包含不同的键,for循环内部的代码将更加复杂. :::