python第五章—字典(使用字典,遍历字典,嵌套字典)

# 字典
# 一个简单的字典
# 来看一个游戏,其中包含一些外星人,这些外星人的颜色和点数各不相同,下面是一个简单的字典,储存了有关特定外星人的信息
alien_0 = {'color':'green','points':5}
print(alien_0['color'])
print(alien_0['points'])
# 字典alien_0储存了外星人的颜色和点数,使用两条print语句来访问并打印这条消息

# 在python中,字典是一系列 键-值对,每个键都与一个值关联,你可以使用键来访问与之相关联的值
# 与键相关联的值可以是数字,字符串,列表,乃至字典,事实上,可将任何python对象用做字典的值。
# 在python中,字典用放在花括号{}中的一系列 键-值对表示,如前面的示例所示
#   alien_0 = {'color':'green','points':5}
# 键-值对是两个相关联的值。指定键时,python将返回与之相关联的值,键和值之间用冒号分隔,而键-值对之间用逗号分隔
# 在字典中,你想储存多少个键都可以,最简单的字典只有一个键-值对,如下述修改后的字典alien_0所示
#   alien_0 = {'color':'green'}
# 这个字典只储存了一项有关alien_0的信息,具体地说是这个外星人的颜色,在这个字典中字符串’color’是一个键,与之相关联的值是‘green’

# 访问字典中的值
# 要获取与键相关联的值,可依次指定字典名和放在方括号内的键,如下所示
alien_0 = {'color':'green','points':5}
print(alien_0['color'])
# 这将返回字典alien_0中与键‘color’相关联的值:green

# 现在你可以访问外星人alien_0的颜色和点数,如果玩家射杀了这个外星人,你就可以使用下面的代码来确定玩家应获得多少点
alien_0 = {'color':'green','points':5}
new_points = alien_0['points']
print("You just earned "+str(new_points)+" points")
# 上述代码首先定义了一个字典,然后从这个字典中获取与键‘points’相关联的值
# 并将这个变量储存在变量new_points中,接下来,将这个整数转换成为字符串,并打印一条消息,指出玩家获得了多少个点

# 添加键—值对
# 字典是一种动态结构,可随时在其中添加键-值对,要添加键-值对,可以此指定字典名,用方括号括起的键和相关联的值
# 在下面字典找中添加两项信息:外星人的x,y坐标,让我们能够在屏幕的特定位置显示该外星人。
# 我们将这个外星人放在屏幕左边缘,且离屏蔽上边缘25像素的地方,由于屏幕坐标系的原点通常为左上角,因此要将外星人放在屏幕左边缘
# 可将x坐标设置为0,要将该外星人放在离屏幕顶部25像素的地方,可将y坐标设置为25
alien_0 = {'color':'green','points':5}
print(alien_0)
alien_0['x_position'] = 0
alien_0['y_position'] = 25
print(alien_0)
# 注意,键-值对的排列顺序与添加顺序不同。python不关心键-值对的添加顺序。而关心键和值之间的关联关系

# 先创建一个空字典
alien_0 = {}
alien_0['color']='yellow'
alien_0['points']=9
print(alien_0)
# 这里首先定义了空字典alien_0,再在其中添加颜色和点数
# 使用字典来储存用户提供的数据或在编写能自动生成大量键-值对的代码时,通常都先定义一个空字典

# 修改字典中的值
# 要修改字典中的值,可依次制定字典名,用方括号括起的键以及与该键相关联的新值,例如:假设随着游戏进行,改变外星人的颜色
alien_0 = {'color':'green','points':5}
print('未修改过的颜色是'+alien_0['color']+'.')
alien_0['color'] = 'yellow'
print('修改过后的颜色是'+alien_0['color']+'.')

# 来看一个更有趣的例子,对一个能够以不同速度移动的外星人的位置进行沟通,为此我们将储存该外星人的当前速度,并据此确定该外星人向右移动多远
alien_0 = {'x_position': 0,'y_position': 25,'speed':'medium'}
print("Original x_position: " + str(alien_0['x_position']))
if alien_0['speed'] == 'slow':
    x_increment = 1
elif alien_0['speed'] == 'medium':
    x_increment = 2
else:
    x_increment = 3
alien_0['x_position'] = alien_0['x_position'] + x_increment
print("New x_position: " + str(alien_0['x_position']))

# 删除键-值对
# 对于字典不在需要的信息,可使用del语句将相应的键-值对彻底删除,使用del语句时,必须制定字典名和要删除的键
# 例如,下面代码从字典alien_0中删除'color'及其值
alien_0 = {'color':'green','points':5}
print(alien_0)
del alien_0['color']
print(alien_0)
# 以上的代码将键'color'从字典中删除,同时删除与这个键相关联的值。输出表明键'color'及其值’green',但其他键-值对未受影响
#  注意删除的键-值对永远消失了

# 由类似对象组成的字典
# 你可以调查很多人,询问他们最喜欢的编程语言,可使用一个字典来储存这种简单调查的结果,如下所示:
favorite_languages = {
    'zhangsan':'c',
    'lisi':'java',
    'waner':'python',
    'mazi':'ruby',
}
# 正如你所看到的,每个被调查者喜欢的语言,都与其相对应
# 给定调查者的名字,可使用这个字典轻松的获取他喜欢的语言:
print("张三喜欢的编程语言是:"+
      favorite_languages['zhangsan']+
      "语言")

# 遍历字典:
# 一个python字典可能只包含几个键-值对,也有可能包含数百万个键-值对,鉴于字典可能包含大量的数据
# python支持字典遍历,字典可用于以各种方式储存信息,因此有多种遍历字典的方式:可遍历字典中所有的键—值对,键或值
# 遍历所有的键-值对
# 举例,下面字典储存的是用户的名、和姓:
user_0 = {
    'usersname':'zhangsan',
    'first':'enrico',
    'last':'fermi',
    }
# 如果要获取该用户字典中的所有信息,可使用一个for循环来遍历这个字典:
for key,value in user_0.items():
    print("\nkey:" + key)
    print("\nvalue: "+ value)

# 遍历字典中的所有的键
# 在不需要使用字典中的值是,方法keys()很有用,下面来遍历字典favorite_languages,并且将每个调查者的名字打印出来
favorite_languages = {
    'zhangsan':'c',
    'lisi':'java',
    'waner':'python',
    'mazi':'ruby',
}
for name in favorite_languages.keys():
    print(name.title())
# 上列代码让python提取字典favorite_languages中的所有键,并依次将他们储存到变量name中,输出了每个被调查者的名字:

# 按顺序遍历字典中所有的键
# 字典总是明确地记录键和值之间的关联关系,但获取字典的元素时,获取的顺序是不可预测的
# 要以特定的顺序返回元素,一种办法是在for循环中对返回的键进行排序,为此,可使用函数sorted()来获得按特定顺序排列的键列表的副本
favorite_languages = {
    'zhangsan':'c',
    'lisi':'java',
    'waner':'python',
    'mazi':'ruby',
}
for name in sorted(favorite_languages.keys()):       # keys是不需要字典中的值,只要键
    print(name.title()+ ",thank you taking the poll!")
# 这条for语句类似于其他for语句,但对方法dictionary.keys()的结果调用了函数sorted()
# 这让python列出所有的键,并在遍历前对这个列表进行排序,输出表明,按顺序显示了所有被调查的名字 (按照首字母 26字母顺序排列)

# 遍历字典中的值
# 如果你感兴趣的主要是字典包含的值,可使用方法values(),它返回一个值列表,而不包含任何键
# 下面举个例子,还是调查者的姓名和喜欢的编程语言,但是其中只包含调查者选择的语言,而不包含被调查者的名字
favorite_languages = {
    'zhangsan':'c',
    'lisi':'java',
    'waner':'python',
    'mazi':'ruby',
}
print("The follwing languages have been mentioned:")
for languages in favorite_languages.values():
    print(languages)
# 这条for语句提取字典中的每个值,并将它们依次储存到变量language中
# 这种做法提取字典中的所有值,而没有考虑的是否重复,涉及值很少时,这也许不是问题
# 但如果被调查者很多,最终的列表,可能包含大量的重复项,为剔除重复项,可使用集合(set)。集合类似于列表,但每个元素都必须是独一无二的
favorite_languages = {
    'zhangsan':'c',
    'lisi':'java',
    'waner':'c',
    'mazi':'ruby',
}
for languages in set(favorite_languages.values()):
    print(languages)

# 嵌套:
# 有时候,需要将一系列字典储存在列表中,或将列表作为值储存在字典中,这称为嵌套。
# 你可以在列表中嵌套字典,在字典中嵌套列表甚至在字典中嵌套字典
# 字典列表
# 字典alien_0包含一个外星人的各种信息,但无法储存在第二个外星人信息,更别说屏幕上全部外星人的信息了,如何管理成群结队的外星人呢?
# 一种方法是创建一个外星人列表,其中每个外星人都是一个字典,包含有关该外星人的各种信息
# 例如:下面的代码创建了一个包含三个外星人的列表:
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)
# 我们首先创建了三个字典,其中每个字典都表示一个外星人,我们将这些字典都放到一个名为aliens的列表中,最后我们遍历这个列表,将外星人都打印出来

# 更符合现实情形的是,外星人不止三个,且每个外星人都是由代码自动生成的,在下面的示例中,我们使用range()生成了30个外星人
aliens = []
for alien_number in range(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'] = 'medium'
        alien['points'] = 10
        print(alien)
    elif alien['color'] == 'yellow':
        alien['color'] = 'red'
        alien['speed'] = 'fast'
        alien['points'] = 15
        print(alien)
# 显示前五个外星人
for alien in aliens[:5]:
    print(alien)
print('....')


# 显示创建了多少个外星人
print('Total number of aliens:'+ str(len(aliens)))
# 在这个示例中,首先创建一个空列表,用于储存接下来将创建的所有外星人,在第二行代码range()返回一系列数字,是告诉python要重复循环多少次
# 每次执行这个循环时,都创建一个外星人(在第三行代码),并将其附加到列表aliens末尾(第四行代码)
# 然后使用切片来打印前五个外星人(不包括第五个,因为是从零开始)
# 最后,打印列表长度,证明创建了30个外星人

# 这些外星人都具有相同的特征,但在python看来,每个外星人都是独立的,这让我们能够独立的修改每个外星人
# 可能随着游戏的进行,有些外星人会变色且移动速度会加快,必要时,可以使用for循环和if语句来修改某些外星人的颜色
# 例如,要将前三个外星人修改为黄色的,速度为中等且值10点,看上面第二个for循环
# 你可以进一步扩展这个循环,在其中添加一个elif代码块,将黄色的外星人改为移动速度快且值为15个点的外星人

# 在字典里储存列表
# 有时候需要将列表储存在字典中,而不是将字典储存在列表中,例如你如何描述顾客点的披萨呢?
# 如果使用列表,只能储存要添加的披萨配料。但如果使用字典,就不仅可在其中包含配料列表,还可包含其他有关披萨的描述
# 在下面的示例中,储存了披萨两方面的信息:外皮类型和配料列表,其中的配料列表是一个与键 ‘toppings’相关联的值
# 要访问该列表,我们使用字典名和键‘toppings’,就像访问字典中的其他值一样,这将返回一个配料列表,而不是单个值
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)
# 首先创建一个字典,其中储存了有关顾客索点披萨的信息,在这个字典中,一个键是‘crust’,与之相关联的字符串‘thick’
# 下一个键是'toppings',与之相关联的值是一个列表,其中储存了顾客要求添加的所有配料,为打印配料,我们编写了一个for循环
# 为访问配料列表,我们使用了键'toppings',这样python将从字典中提取配料列表

# 在字典中储存字典
# 可在字典中嵌套字典,但这样做时,代码可能很快复杂起来,例如,如果有多个网站用户,每个都有独特的用户名,可在字典中将用户名作为键
# 然后将每位用户的信息储存在一个字典中,并将该字典作为与用户名相关联的值,在下面的程序中,对于每位用户,
# 我们都储存了其三项信息:名,姓和居住地;为访问这些信息,我们遍历所有的用户名,并访问与每个用户相关联的信息字典:
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("\tFull name: " + full_name.title())
    print("\tLocation: " + location.title())
# 请注意,表示每位用户的字典的结构都相同,虽然python并没有这样的要求,但这使得嵌套的字典处理起来更容易
# 倘若表示每位用户的字典都包含不同的键,for循环内部的代码将更复杂

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值