文章目录
- 1. 添加键-值对
- 2. 可以先创建一个空字典,然后再往里面添加键值对
- 3. 修改字典中的值
- 4. 删除键-值对
- 5. 由类型对象组成的字典
- 6. 遍历字典
- 6.1 遍历键-值对
- 6.2 遍历字典中所有的键
- 7. 按顺序遍历字典中所有的键
- 7.1 遍历字典中所有的值
- 8. 嵌套
- 8.1 字典列表
- 8.2 列表字典
- 在字典中存储字典
Python字典用于将相关信息关联起来. 字典是一系列的键值对
alien = {'color': 'red', 'points': 5}
print(alien['color'])
print(alien['points'])
1. 添加键-值对
字典是一种动态结构,可随时在其中添加键值对. 要添加键值对,可依次指定字典名,用方括号括起来的键和相关联的值.
alien = {'color': 'red', 'points': 5}
print(alien['color'])
print(alien['points'])
alien['x_position'] = 5
alien['y_position'] = 20
print(alien)
2. 可以先创建一个空字典,然后再往里面添加键值对
alien = {}
alien['color'] = 'yellow'
alien['points'] = 5
print(alien)
3. 修改字典中的值
alien = {'color': 'yellow', 'points': 5}
print("The alien is " + alien['color'] + ".")
alien['color'] = 'red'
print("The alien now is " + alien['color'] + ".")
4. 删除键-值对
对于不需要的语句,可以使用del语句将其相应的键值对彻底删除.使用del语句时,必须指定字典名和要删除的键.
alien = {'color': 'yellow', 'points': 5}
del alien['color']
print(alien)
5. 由类型对象组成的字典
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
print(favorite_languages['jen'])
print(favorite_languages['phil'])
6. 遍历字典
可以遍历字典的键值对,键或者值
6.1 遍历键-值对
方法 items() 返回一个键值对列表
messages = {
'One': 1,
'Two': 2,
'Three': 3,
'Four': 4,
'Five': 5,
}
for key, value in messages.items():
print(key + ' most favourite num is ' + str(value))
6.2 遍历字典中所有的键
可以使用方法 keys() 它会返回一直 键列表,或者不使用任何方法,因为遍历字典时,会默认遍历所有的键.
LiXu = {
'first_name': 'Li',
'last_name': 'Xu',
'age': 19,
'city': 'CQ',
}
for xu in LiXu:
print(xu)
print('----------')
for xu in LiXu.keys():
print(xu)
7. 按顺序遍历字典中所有的键
字典总是明确的记录键和值之间的关联关系,但获取字典的元素时,获取顺序是不可预测的,这不是问题。因为通常你想要的只是获取键相关联的正确的值。 要以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序。为此可是用函数sorted()来获得按特定顺序排列的键列表的副本。
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
for name in sorted(favorite_languages.keys()):
print(name.title() + " , thank you for taking the poll.")
7.1 遍历字典中所有的值
可以使用方法 values() , 它可以返回一个值列表
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'edward': 'ruby',
'phil': 'python',
}
for value in favorite_languages.values():
print(value)
这种做法是提取字典所有的值,而没有考虑是否重复. 涉及到的值很少时,这也许不是问题,但当涉及到大量的值时,最终的列表可能含有大量的重复项. 为了剔除重复项,可以使用集合(set),集合类似于列表,但不同的是每个元素必须是独一无二的. 可以调用set()方法来找到不包含重复的值的集合.
favorite_languages = {
'jen': 'python',
'sarah': 'c',
'phil': 'python',
}
for favorite_language in set(favorite_languages.values()):
print(favorite_language)
8. 嵌套
有时候,需要将一系列字典存储在列表中,或者将列表作为值存储到字典中,这称为 嵌套 ,嵌套是一种极其强大的功能
8.1 字典列表
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)
在下面的示例中,我们使用range()生成了30个外星人.
# 创建一个存储外星人的空列表
aliens = []
# 创建30个绿色的外星人
for alien_number in range(30):
new_alien = {'color': 'green', 'points': '5', 'speed': 'slow'}
aliens.append(new_alien)
# 显示前5个外星人
for alien in aliens[:5]:
print(alien)
print("...")
# 显示创建了多少个外星人
print("Total number of aliens: " + str(len(aliens)))
这些外星人都有着相同的特征,但在Python看来,每个外星人都是独立的,这让我们能够独立的修改每个外星人. 在什么时候需要处理成群结队的外星人呢?想象一下,可能随着游戏的进行,有些外星人会变色而且移动速度会加快.必要时,我们可以使用for循环和if语句来修改某些外星人的颜色,例如要将前3个外星人修改为黄色,速度为中等,且值为10个点,可以这样写:
# 创建一个存储外星人的空列表
aliens = []
# 创建30个绿色的外星人
for alien_number in range(0, 30):
new_alien = {'color': 'green', 'points': '5', 'speed': 'slow'}
aliens.append(new_alien)
# 修改
for alien in aliens[0:3]:
if alien['color'] == 'green':
alien['color'] = 'yellow'
alien['speed'] = 'middle'
alien['points'] = 10
# 显示前5个外星人
for alien in aliens[0:5]:
print(alien)
print("...")
# 显示创建了多少个外星人
print("Total number of aliens: " + str(len(aliens)))
经常需要在列表中包含大量的字典,而其中每个字典都包含特定对象的众多信息。例如,你可能需要为网站的每个用户创建一个字典,并将这些字典存储在一个名为users 的列表中。在这个列表中,所有字典的结构都相同,因此你可以遍历这个列表,并以相同的方式处理其中的每个字典。
8.2 列表字典
有时候,需要将列表存储在字典中,而不是将字典存储在列表中。例如,你如何描述顾客点的比萨呢﹖如果使用列表,只能存储要添加的比萨配料;但如果使用字典,就不仅可在其中包含配料列表,还可包含其他有关比萨的描述。
# 存储所点披萨的信息
pizza = {'crust': 'thick',
'toppings': ['mushrooms', 'extra cheese'], }
# 概述所点的披萨
print("You ordered a " + pizza['crust'] + "-crust pizza " + "with the following toppings:")
for topping in pizza['toppings']:
print('\t' + topping)
每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。在本章前面有关喜欢的编程语言的示例中,如果将每个人的回答都存储在一个列表中,被调查者就 可选择多种喜欢的语言。在这种情况下,当我们遍历字典时,与每个被调查者相关联的都是一个语言列表,而不是一种语言;因此,在遍历该字典的for 循环中,我们需要再使 用一个for 循环来遍历与被调查者相关联的语言列表:
favorite_languages = {'jen': ['python', 'ruby'],
'sarah': ['c'],
'edward': ['ruby', 'go'],
'phil': ['python', 'haskell'], }
for name, languages in favorite_languages.items():
print("\n" + name.title() + "'s favorite languages are:")
for language in languages:
print('\t' + language.title())
为进一步改进这个程序,可在遍历字典的for 循环开头添加一条if 语句,通过查看len(languages) 的值来确定当前的被调查者喜欢的语言是否有多种。如果他喜欢的语言有 多种,就像以前一样显示输出;如果只有一种,就相应修改输出的措辞,如显示Sarah's favorite language is C 。
注意: 列表和字典的嵌套层级不应太多。如果嵌套层级比前面的示例多得多,很可能有更简单的解决问题的方案
在字典中存储字典
可在字典中嵌套字典,但这样做时,代码可能很快复杂起来。例如,如果有多个网站用户,每个都有独特的用户名,可在字典中将用户名作为键,然后将每位用户的信息存储在 一个字典中,并将该字典作为与用户名相关联的值。在下面的程序中,对于每位用户,我们都存储了其三项信息:名、姓和居住地;为访问这些信息,我们遍历所有的用户名, 并访问与每个用户名相关联的信息字典.
users = {'aeinstein': {'first': 'albert', 'last': 'einstein', 'location': 'princeton', },
'mcurie': {'first': 'marie', 'last': 'curie', 'location': 'paris', }, }
for username, user_info in users.items():
print("\nUsername: " + username)
full_name = user_info['first'] + " " + user_info['last']
location = user_info['location']
print('\tFullname: ' + full_name.title())
print('\tLocation: ' + location.title())
请注意,表示每位用户的字典的结构都相同,虽然Python并没有这样的要求,但这使得嵌套的字典处理起来更容易。倘若表示每位用户的字典都包含不同的键,for 循环内部的 代码将更复杂。