Python个人学习笔记(5)-——字典

Python个人学习笔记 专栏收录该内容
10 篇文章 1 订阅

字典

  • 一个简单的字典
    来看一个游戏,其中包括一些外星人,这些外星人的颜色和点数各不相同。下面是一个简单的字典,存储了有关特定外星人的信息:
alien = {'color':'green','points':5}
print(alien['color'])
print(alien['point'])

运行结果:
green
5

  • 使用字典
    在python中,字典是一系列键-值对。每个键都与一个值相关联,你可以使用键来访问与之相关的值。与键相关联的值可以是数字、字符串、列表乃至字典。事实上,可将任何Python对象当做字典的值
    在python中,字典用放在花括号{}中的一系列键-值对表示。
    键-值对是两个相关联的值。指定键时,Python将返回与之相关联的值。键与值之间用冒号分隔,而键-值对之间用逗号分隔。在字典中,对键-值对的个数不做限制。
    • 访问字典的值
      要获取与键相关联的值,可依次指定字典名和放在方括号内的键。这将返回字典中与键相关联的的值。
      字典中可包含任意数量的键-值对。
    • 添加键-值对
      字典是一种动态结构,可随时在其中添加键-值对。
      添加键-值对的步骤:依次指定字典名、用方括号括起的键和相关联的值。
    person = {'name':'Lee'}
    #先创建一个字典
    print(person)
    #打印初始状态
    person['grade'] = 96
    person['high'] = 1.70
    person['weight'] = '116Kg'
    #添加新的键-值对
    print(person)
    #打印处理后的字典
    
    运行结果:
    {‘name’: ‘Lee’}
    {‘name’: ‘Lee’, ‘grade’: 96, ‘high’: 1.7, ‘weight’: ‘116Kg’}
    注意:键-值对的排列顺序和添加列表不一定相同(版本3.5及之前的为无序,3.6开始有序)。
    • 先创建一个空字典
      有时候,在空字典中添加键-值对是为了方便,而有时候必须这样做。为此,可先使用一对空的花括号定义一个字典,再分行添加各个键-值对。
    person = {}
    #定义一个空字典
    person['name'] = 'Lee'
    person['grade'] = 96
    person['high'] = 1.70
    person['weight'] = '116Kg'
    #添加新的键-值对
    print(person)
    #打印字典
    
    运行结果:
    {‘name’: ‘Lee’, ‘grade’: 96, ‘high’: 1.7, ‘weight’: ‘116Kg’}
    使用字典来存储用户提供的数据或在编写能自动生成大量键-值对的代码时,通常都需要先定义一个空字典
    • 修改字典中的值
      要修改字典中的值,可依次指定字典名、用方括号括起来的以及与该键相关联的新值。

      例如:随着时间的变化,Lee长高了,变重了:
    person = {'name': 'Lee', 'grade': 96, 'high': 1.7, 'weight': '116Kg'}
    #初始状态
    print(person)
    person['high'] = 1.76
    person['weight'] = '126Kg'
    #修改后
    print(person)
    
    运行结果:
    {‘name’: ‘Lee’, ‘grade’: 96, ‘high’: 1.7, ‘weight’: ‘116Kg’}
    {‘name’: ‘Lee’, ‘grade’: 96, ‘high’: 1.76, ‘weight’: ‘126Kg’}
    • 删除键-值对
      对于字典中不再需要的信息,可使用del语句将相对应的键-值对彻底删除。使用del语句时,必须指定字典名和要删除的键。

    复习一下,del语句也可以用来删除列表元素,表达式为:
    del 列表名[元素索引]

    person = {'name': 'Lee', 'grade': 96, 'high': 1.7, 'weight': '116Kg'}
    #初始状态
    print(person)
    del person['grade']
    #删除键-值对
    print(person)
    
    运行结果:
    {‘name’: ‘Lee’, ‘grade’: 96, ‘high’: 1.7, ‘weight’: ‘116Kg’}
    {‘name’: ‘Lee’, ‘high’: 1.7, ‘weight’: ‘116Kg’}
    注意:删除的键-值对永远消失了
    • 由类型对象组成的列表
      在前面的示例中,字典存储的是一个对象的多种信息,但你也可以使用列表来存储众多对象的同一种信息。例如,假设你要调查很多人,询问它们最喜欢的编程语言,可使用一个字典来存储这种简单调查的结果:
    favorite_languages = {
      'Jen':'python',
      'Lee':'java',
      'Sarah':'c++',
      'Phil':'c'
      }
    print(favorite_languages)
    print"jen's favorite_language is "+
      favorite_language['jen'].title()+
      '.')
    
    运行结果:
    {‘Jen’: ‘python’, ‘Lee’: ‘java’, ‘Sarah’: ‘c++’, ‘Phil’: ‘c’}
    jen’s favorite_language is Python.
    正如你所看到的,我们将一个较大的字典放在了多行中。确定需要使用多行来定义字典时,在左花括号后按回车键,再在下一行缩进四个空格,指定第一个键-值对,并在它后面加上一个逗号。此后你再此按回车键时,文本编辑器将自动缩进后续键-值对,且缩进量和第一个键-值对相同。
    定义好字典后,在最后一个键-值对的下一行添加一个右花括号,并缩进四个空格,使其与字典中的键对齐。另一种不错的做法的在最后一个键-值对后面也加上逗号,为以后在下一行添加键-值对做好准备。
    同时,上面演示了如何将较长的print语句分成多行。单词print比大多数字典名都短,因此让输出的第一部分紧跟在左括号后面是合理的。请选择在适合的地方拆分要打印的内容,并在第一行末尾加上一个拼接运算符(+)。按回车键进入print语句的后续各行,并使用Tab键将它们对齐并缩进一级。指定要打印的所有内容后,在print语句的最后一行末尾加上右括号。

注意:对于较长的列表和字典,大多数编辑器都有以类似方式设置其格式的功能。对于较长的字典,还有其他一些可行的格式设置方式,因此在你的编译器或其他源代码中,你可能看到稍微不同的格式设置方式。

  • 遍历字典
    一个Python字典可能只包含几个键-值对,也可能包含数百万个键-值对。鉴于字典可能包含大量的数据,Python支持对字典遍历。字典可用于各种方式存储信息,因此有多种遍历字典的方式:可遍历字典的所有键-值对、键或值。

    • 遍历所有的键-值对
      如下所示,要编写用于遍历字典的for循环,可声明两个变量,用于存储键-值对中的键和值。对于这两个变量,可使用任何名称。(当然,最好是使用见名知义简洁变量名。
      for语句的第二部分包含字典名和方法items(),它返回一个键-值对列表。接下来,for循环依次将每个键-值对存储到指定的两个变量中。在下面的示例中,我们使用这两个变量来打印每个键及与其相关联的值。第一条print语句中的“\n"确保在输出每个键值对前都插入一个空行。
    user = {
      'username':'efermi',
      'first':'enrico',
      'last':'fermi',
    }
    for Key,Value in user.items():
      print("\nKey:" + Key)
      print("Value:" +Value)
    #遍历字典
    

    运行结果:

    Key:username
    Value:efermi

    Key:first
    Value:enrico

    Key:last
    Value:fermi

    • 遍历字典中的所有键
      在不需要使用列表的值时,方法keys()很有用。遍历列表时,会默认遍历所有的键,因此,如果下面代码中的for name in favorite_languages.keys()替换成for name in favorite_languages,输出将不变。
      下面用来遍历字典favorite_languages:
    favorite_languages = {
      'Jen':'python',
      'Lee':'java',
      'Sarah':'c++',
      'Phil':'c'
      }
    friends = ['Lee','Jen']
    for name in favorite_languages.keys():
      print(name)
      #将每个被调查者都打印出来
      if name in friends:
      #检查当前名字是否在列表friends中
        print("Hi " + name +
          ",I see your favorite language is " +
          favorite_language[name].title() + "!")
        #当前名字在列表friends中,打印问候语
    if 'erin' not in favorite_languages.keys():
    #判断某个人是否接受了调查
      print("Erin,please take our poll!")
      #邀请参加调查
    

    运行结果:
    Jen
    Hi Jen,I see your favorite language is Python!
    Lee
    Hi Lee,I see your favorite language is Java!
    Sarah
    Phil
    Erin,please take our poll!
    方法keys()并非只能用于遍历;实际上,它返回一个列表,其中包含字典中的所有键,因此上面代码行只是在核实’erin’是否包含在这个列表中。

    • 按顺序遍历字典中的所有值
      字典总是明确地记录键与值之间的关联关系,但获取字典的元素时,获取的顺序是不可预测的。但这不是问题,因为通常你想要的只是获取与键相关联的正确的值。
      要以特定的顺序返回元素,一种方法是在for循环中对返回的键进行排序为此,可使用函数sorted()来获得按特定顺序排列的键列表的副本:
    favorite_languages = {
      'Jen':'python',
      'Lee':'java',
      'Sarah':'c++',
      'Phil':'c'
      }
    for name in sorted(favorite_languages.keys()):
      print(name)
    

    运行结果:
    Jen
    Lee
    Phil
    Sarah

    • 遍历字典中的所有值
      如果你感兴趣的主要是字典包含的值,可使用方法values(),它返回一个值列表,而不包含任何键。例如:
    favorite_languages = {
      'Jen':'python',
      'Lee':'java',
      'Sarah':'c++',
      'Phil':'c'
      }
    print("The following languages have been mentioned:")
    for language in favorite_languages.values():
      print(language.title())
    

    运行结果:
    The following languages have been mentioned:
    Python
    Java
    C++
    C
    这种做法提取字典中所有的值,而没有考虑是否重复。涉及的值很少时,这也许不是问题,但若是被调查者很多,最终的列表可能包含大量重复项。为剔除重复项可使用集合。集合类似于列表,但每一个元素都是独一无二的:

    favorite_languages = {
      'Jen':'python',
      'Lee':'java',
      'Sarah':'c++',
      'Phil':'python'
      }
    print("The following languages have been mentioned:")
    for language in set(favorite_languages.values()):
      print(language.title())
    

    运行结果:
    The following languages have been mentioned:
    C++
    Python
    Java

  • 嵌套
    有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这叫嵌套。你可以在列表中嵌套字典、在字典中嵌套列表甚至字典中嵌套字典。

    • 字典列表
      字典person_0可以包含一个人的基本信息,但无法存储第二个人的信息,更别说人群了。如何管理人群的信息呢?一种方法是创建一个人列表,其中每个人都是一个字典,包含有关该某个人的各种信息。
    person_0 = {'name':'Lee','high':178}
    person_1 = {'name':'Jen','high':169}
    person_2 = {'name':'Phil','high':167}
    persons = [person_0,person_1,person_2]
    for person in persons:
      print(person)
    

    运行结果:
    {‘name’: ‘Lee’, ‘high’: 178}
    {‘name’: ‘Jen’, ‘high’: 169}
    {‘name’: ‘Phil’, ‘high’: 167}
    当然,更符合现实的情形是,人不止三个,且每个人都是用代码自动生成的。在下面,我们用range()生成了30个人:

    persons = []
    #创建一个用于存储人的空列表
    for person_number in range(30):
    #创建30个人
      new_person = {'weight':'130Kg','high':178}
      persons.append(new_person)
    for person in persons:
    #显示前5个人的数据
      print(person)
    print("...")
    print("Totol number of persons: " + str(len(persons)))
    #显示共创建了多少个外星人
    

    运行结果:
    {‘weight’: ‘130Kg’, ‘high’: 178}
    {‘weight’: ‘130Kg’, ‘high’: 178}
    {‘weight’: ‘130Kg’, ‘high’: 178}
    {‘weight’: ‘130Kg’, ‘high’: 178}
    {‘weight’: ‘130Kg’, ‘high’: 178}

    Totol number of persons: 30
    当然,这些人具有相同的特征,但在Python看来,每个人都是独立的,这让我们可以独立地修改每一个人。

经常需要在列表中包含大量的字典,而其中每个字典都包含特定对象的众多信息.例如,你可能需要为网站的每个用户创建一个字典,并将只写字典存储在一个users的列表中.在这个列表中,所有列表的结构都相同,因此你可以遍历这个列表,并以同样的方式处理其中的各个字典。

  • 在字典中存储列表
    有时候,需要将列表存储在字典中,而不是将字典存储在列表中。例如,你如何描述顾客点的比萨呢?如果使用列表,只能存储要添加的比萨配料;但如果使用字典就不仅能在其中包含比萨列表,还可以包含其他有关比萨的描述。
    我们首先创建了一个字典,其中存储了有关顾客所点比萨的信息。在这个字典中,一个键是’crust’,与之相关联的值是字符串’thick’;下一个键是’toppings’,与之相关联的值是一个列表,其中存储了顾客要求添加的所有配料。制作前我们概述了顾客所点的比萨。为打印配料,我们编写了一个for循环。为访问配料列表,我们用了键‘toppings’,这样Python将从字典中提取配料列表。
pizza = {
  'crust':'thick',
  'toppings':['mushrooms','extra cheese'],
  }
#存储所点比萨的信息
print("you ordered a " + pizza['crust'] + "-extra pizza " +
  "with the following toppings:")
#概述所点的比萨
for topping in pizza['toppings']:
  print("\t" + topping)

运行结果:
you ordered a thick-extra pizza with the following toppings:
mushrooms
extra cheese
每当需要在字典中将一个键关联多个值时,都可以在字典中嵌套一个列表。在前面有关的编程语言的示例中,如果将每个人的回答都存储在一个列表中,被调查者就可以选择多门喜欢的语言了。在这种情况下,当我们遍历列表时,与每个被调查者相关联的都是一个语言列表,而不是一种语言;因此,在遍历该字典的for循环中。我们需要再使用一个for循环来遍历与被调用者相关联的语言列表:

favorite_languages = {
  'Jen':['python'],
  'Lee':['c','ruby'],
  'edward':['java','c++'],
  'Lily':['python','c++'],
  }
for name,languages in favorite_languages.items():
  print("\n" + name.title()+"'s favorite languages are:")
  for language in languages:
    print("\t" + language.title())

运行结果:
Jen’s favorite languages are:
Python

Lee’s favorite languages are:
C
Ruby

Edward’s favorite languages are:
Java
C++

Lily’s favorite languages are:
Python
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("\tFull_name:" + full_name.title())
  print("\tLocation:" + location.title())

运行结果:
Username:aeinstein
Full_name:Albert Einstein
Location:Princeton

Username:mcurie
Full_name:Marie Curie
Location:Paris
我们首先定义了一个名为users的字典,其中包含了两个键:用户名’aeinstein’和’mcurie’;与每一个键相关联的值都是一个字典,其中包含用户的名、姓和居住地。
请注意,表示表示每位用户的字典的结构都相同,虽然Python并没有这样的需求,但这使得嵌套的字典处理起来更容易。倘若表示每位用户的字典都包含不同得键,for循环内部的结构将变得更复杂。

个人从书本学到的知识,作为自己学习笔记的同时,与各位朋友分享,如有不足,请多多指教

参考文献:《Python编程从入门到实践》【美】Eric Matthes 著 袁国忠 译

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

100-1 = 0

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值