当前位置:嗨网首页>书籍在线阅读

03-字典与列表

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

5.1.1 字典与列表

不像列表,字典中的项是不排序的。在名为 spam 的列表中,第一个项是 spam[0] 。但字典中没有“第一个”项。虽然在确定两个列表是否相同时,表项的顺序很重要,但在字典中,键-值对输入的顺序并不重要。在交互式环境中输入以下代码:

>>> spam = ['cats', 'dogs', 'moose']
>>> bacon = ['dogs', 'moose', 'cats']
>>> spam == bacon
False
>>> eggs = {'name': 'Zophie', 'species': 'cat', 'age': '8'}
>>> ham = {'species': 'cat', 'age': '8', 'name': 'Zophie'}
>>> eggs == ham
True

因为字典是不排序的,所以不能像列表那样切片。

尝试访问字典中不存在的键,将出现 KeyError 错误信息。这很像列表的“越界” IndexError 错误信息。在交互式环境中输入以下代码,并注意显示的错误信息,因为没有 'color' 键:

>>> spam = {'name': 'Zophie', 'age': 7}
>>> spam['color']
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    spam['color']
KeyError: 'color'

尽管字典是不排序的,但可以用任意值作为键,这一点让你能够用强大的方式来组织数据。假定你希望程序保存朋友生日的数据,就可以使用一个字典,用名字作为键,用生日作为值。打开一个新的文件编辑器窗口,输入以下代码,并保存为birthdays.py:

❶ birthdays = {'Alice': 'Apr 1', 'Bob': 'Dec 12', 'Carol': 'Mar 4'}
  while True:
      print('Enter a name: (blank to quit)')
      name = input()
      if name == '':
          break
  ❷ if name in birthdays:
      ❸ print(birthdays[name] + ' is the birthday of ' + name)
    else:
         print('I do not have birthday information for ' + name)
         print('What is their birthday?')
         bday = input()
      ❹  birthdays[name] = bday
         print('Birthday database updated.')

可以在https://autbor.com/bdaydb上查看该程序的执行情况。你创建了一个初始的字典,将它保存在 birthdays 中❶。用 in 关键字,可以查看输入的名字是否作为键存在于字典中❷,就像查看列表一样。如果该名字在字典中,那么你可以用方括号访问关联的值❸。如果不在,那么你可以用同样的方括号语法和赋值操作符添加它❹。

运行这个程序,结果看起来如下所示:

Enter a name: (blank to quit)
Alice
Apr 1 is the birthday of Alice
Enter a name: (blank to quit)
Eve
I do not have birthday information for Eve
What is their birthday?
Dec 5
Birthday database updated.
Enter a name: (blank to quit)
Eve
Dec 5 is the birthday of Eve
Enter a name: (blank to quit)

当然,在程序终止时,你在这个程序中输入的所有数据都丢失了。在第 9章中,你将学习如何将数据保存在硬盘的文件中。

Python 3.7中排序的字典

在Python 3.7及更高版本中,尽管字典仍然没有排序,没有“第一个”键-值对,但是如果你在它们中创建序列值,字典将记住其键-值对的插入顺序。例如,请注意,在 eggsham 字典产生的列表中,项的顺序与输入顺序相同:

>>> eggs = {'name': 'Zophie', 'species': 'cat', 'age': '8'}
>> list(eggs)
['name', 'species', 'age']
>> ham = {'species': 'cat', 'age': '8', 'name': 'Zophie'}
>> list(ham)
['species', 'age', 'name']

字典仍然是无序的,因为你无法用 eggs[0]ham[2] 之类的整数索引访问其中的项。你不应该依赖这种行为,因为在旧版本的Python中,字典不记得键-值对的插入顺序。例如,当我在Python 3.5中运行这段代码时,请注意,列表与字典的键-值对的插入顺序不匹配:

>>> spam = {}
>>> spam['first key'] = 'value'
>>> spam['second key'] = 'value'
>>> spam['third key'] = 'value'
>>> list(spam)
['first key', 'third key', 'second key']