「Python教程09」字典和结构化数据

Python学习笔记

作者: Duter2016 | 2019-09-27 | 阅读
「编辑」 「本文源码」

1、字典的索引被称为“键”,键及其关联的值称为“键-值”对。
在代码中,字典输入时带花括号{}。在交互式环境中输入以下代码:

>>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}

这将一个字典赋给myCat变量。这个字典的键是’size’、’color’和’disposition’。这些键相应的值是’fat’、’gray’和’loud’。可以通过它们的键访问这些值:

>>> myCat['size']
'fat'
>>> 'My cat has ' + myCat['color'] + ' fur.'
'My cat has gray fur.'

字典仍然可以用整数值作为键,就像列表使用整数值作为下标一样,但它们不必从0开始,可以是任何数字。

>>> spam = {12345: 'Luggage Combination', 42: 'The Answer'}

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

3、字典查询和添加新值:
假定你希望程序保存朋友生日的数据,就可以使用一个字典,用名字作为键,用生日作为值。打开一个新的文件编辑窗口,输入以下代码,并保存为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.')

你创建了一个初始的字典,将它保存在birthdays中❶。用in关键字,可以看看输入的名字是否作为键存在于字典中❷,就像查看列表一样。如果该名字在字典中,你可以用方括号访问关联的值❸。如果不在,你可以用同样的方括号语法和赋值操作符添加它❹。
当然,在这个程序终止时,你在这个程序中输入的所有数据都丢失了。

4、 keys()、values()和items()方法

有3个字典方法,它们将返回类似列表的值,分别对应于字典的键、值和键-值对:keys()、values()和items()。这些方法返回的值不是真正的列表,它们不能被修改,没有append()方法。但这些数据类型(分别是dict_keys、dict_values和dict_items)可以用于for循环。为了看看这些方法的工作原理,请在交互式环境中输入以下代码:

>>> spam = {'color': 'red', 'age': 42}
>>> for v in spam.values():
print(v)
 
red
42

这里,for循环迭代了spam字典中的每个值。for循环也可以迭代每个键,或者键-值对:

>>> for k in spam.keys():
print(k)
 
color
age
>>> for i in spam.items():
print(i)
 
('color', 'red')
('age', 42)

利用keys()、values()和items()方法,循环分别可以迭代键、值或键-值对。请注意,items()方法返回的dict_items值中,包含的是键和值的元组。
如果希望通过这些方法得到一个真正的列表,就把类似列表的返回值传递给 list函数。在交互式环境中输入以下代码:

>>> spam = {'color': 'red', 'age': 42}
>>> spam.keys()
dict_keys(['color', 'age'])
>>> list(spam.keys())
['color', 'age']

list(spam.keys())代码行接受keys()函数返回的dict_keys值,并传递给list()。然后返回一个列表,即[‘color’, ‘age’]。
也可以利用多重赋值的技巧,在for循环中将键和值赋给不同的变量。在交互式环境中输入以下代码:

>>> spam = {'color': 'red', 'age': 42}
>>> for k, v in spam.items():
print('Key: ' + k + ' Value: ' + str(v))
 
Key: age Value: 42
Key: color Value: red

5、 检查字典中是否存在键或值

in和not in操作符可以检查值是否存在于列表中。也可以利用这些操作符,检查某个键或值是否存在于字典中。在交互式环境中输入以下代码:

>>> spam = {'name': 'Zophie', 'age': 7}
>>> 'name' in spam.keys()
True
>>> 'Zophie' in spam.values()
True
>>> 'color' in spam.keys()
False
>>> 'color' not in spam.keys()
True
>>> 'color' in spam
False

6、字典有一个get()方法,它有两个参数:要取得其值的键,以及如果该键不存在时,返回的备用值。
在交互式环境中输入以下代码:

>>> picnicItems = {'apples': 5, 'cups': 2}
>>> 'I am bringing ' + str(picnicItems.get('cups', 0)) + ' cups.'
'I am bringing 2 cups.'
>>> 'I am bringing ' + str(picnicItems.get('eggs', 0)) + ' eggs.'
'I am bringing 0 eggs.'

因为picnicItems字典中没有’egg’键,get()方法返回的默认值是0。

7、你常常需要为字典中某个键设置一个默认值,当该键没有任何值时使用它。setdefault()方法提供了一种方式,在一行中完成这件事。传递给该方法的第一个参数,是要检查的键。第二个参数,是如果该键不存在时要设置的值。如果该键确实存在,方法就会返回键的值。在交互式环境中输入以下代码:

>>> spam = {'name': 'Pooka', 'age': 5}
>>> spam.setdefault('color', 'black')
'black'
>>> spam
{'color': 'black', 'age': 5, 'name': 'Pooka'}
>>> spam.setdefault('color', 'white')
'black'
>>> spam
{'color': 'black', 'age': 5, 'name': 'Pooka'}

8、用字典方法遍历字符串中字母出现的次数:
计算一个字符串中每个字符出现的次数。打开一个文件编辑器窗口,输入以下代码,保存为characterCount.py:

message = 'It was a bright cold day in April, and the clocks were striking thirteen.'
count = {}
for character in message:
	count.setdefault(character, 0)
	count[character] = count[character] + 1

print(count)程序循环迭代message字符串中的每个字符,计算每个字符出现的次数。setdefault()方法调用确保了键存在于count字典中(默认值是0),这样在执行count[character] = count[character] + 1时,就不会抛出KeyError错误。程序运行时,输出如下:

{' ': 13, ',': 1, '.': 1, 'A': 1, 'I': 1, 'a': 4, 'c': 3, 'b': 1, 'e': 5, 'd': 3, 'g': 2, 'i':
6, 'h': 3, 'k': 2, 'l': 3, 'o': 2, 'n': 4, 'p': 1, 's': 3, 'r': 5, 't': 6, 'w': 2, 'y': 1}

从输出可以看到,小写字母c出现了3次,空格字符出现了13次,大写字母A出现了1次。无论message变量中包含什么样的字符串,这个程序都能工作,即使该字符串有上百万的字符!
Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串。

9、 漂亮打印

如果程序中导入pprint模块,就可以使用pprint()和pformat()函数,它们将“漂亮打印”一个字典的字。如果想要字典中表项的显示比print()的输出结果更干净,这就有用了。修改前面的characterCount.py程序,将它保存为prettyCharacterCount.py。

import pprint
message = 'It was a bright cold day in April, and the clocks were striking
thirteen.'
count = {}
for character in message:
	count.setdefault(character, 0)
	count[character] = count[character] + 1
pprint.pprint(count)

这一次,当程序运行时,输出看起来更干净,键排过序。

{' ': 13,
',': 1,
'.': 1,
'A': 1,
'I': 1,
'a': 4,
'b': 1,
'c': 3,
'd': 3,
'e': 5,
'g': 2,
'h': 3,
'i': 6,
'k': 2,
'l': 3,
'n': 4,
'o': 2,
'p': 1,
'r': 5,
's': 3,
't': 6,
'w': 2,
'y': 1}

如果字典本身包含嵌套的列表或字典,pprint.pprint()函数就特别有用。
如果希望得到漂亮打印的文本作为字符串,而不是显示在屏幕上,那就调用pprint.pformat()。下面两行代码是等价的:

pprint.pprint(someDictionaryValue)
print(pprint.pformat(someDictionaryValue))

版权声明:本文由 Duter2016 在 2019年09月27日发表。本文采用CC BY-NC-SA 4.0许可协议,非商业转载请注明出处,不得用于商业目的。
文章题目及链接:《「Python教程09」字典和结构化数据》




  相关文章:

「游客及非Github用户留言」:

「Github登录用户留言」:

TOP