和列表一样,字典也是许多值的集合。但是与列表索引不同,字典索引可以使用许多不同的数据类型,而不仅仅是整数。字典的索引称为键,具有关联值的键称为键值对,每个键值对中的两个值以冒号连接,前者为键,后者为值,键值对间用逗号隔开。
>>> myCat = {'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
值得注意的是由于字典是无序的所以无法用切片。
而字典的索引通过键来实现:
>>> myCat['size']
'fat'
虽然字典不是有序的,但是键可以有任意的值,所以字典拥有强大的数据组织能力。例如我们可以用它来构建一个可以更新的小型数据库。
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 #与列表添加值(append insert)不同
print('Birthday database updated.')
在这里字典添加值直接用类似birthdays[name] = bday,这样的代码就可以添加了。
执行代码如下:
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)
利用key( )和for循环可以遍历字典中的所有键值。
spam = {'color': 'red', 'age': 42}
>>> for k in spam.keys():
print(k)
color
age
如果你想把字典中的键都放到一个列表中的话:
>>> spam = {'color': 'red', 'age': 42}
>>> spam.keys()
dict_keys(['color', 'age'])
>>> list(spam.keys())
['color', 'age']
在这里list()是将值转化成列表值的函数。
利用values( )和for循环可以遍历字典中的所有值。
>>> for v in spam.values():
print(v)
red
42
利用items( )和for循环可以遍历字典中的所有键值对。
>>> for i in spam.items():
print(i)
('color', 'red')
('age', 42)
以元组的形式给出
可以使用for循环中的多重赋值技巧将键和值分配给单独的变量。
一般用items( )这个函数时需要用到这种方法,在分析嵌套的字典中很有用。
>>> 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
k和v一一对应字典中的键和值。
可以使用这些操作符来查看某个键或值是否存在于字典中。结果是布尔值。
>>> 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
其中最后一个等价于于 ‘color’ in spam.keys()
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中有键cups所以返回cups所对应的值2,由于该字典中没有键eggs所以返回get( )指定的返回值0。
setdefault( )的第一个参数是要检查的键,第二个参数是要在该键不存在时设置的值。如果键确实存在,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'}
模块中的pprint( )和pformart( )函数可以更加美观的打印出字典的值。
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
print(count)
pprint.pprint(count)
对比结果:
{' ': 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}
{' ': 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}
在复杂的代码中往往会在字典和列表中嵌套字典和列表,学会使用之前学过的各种操作符和函数读取复杂的数据结构。
在下面的代码中我们来分析一下:
allGuests = {'Alice': {'apples': 5, 'pretzels': 12},
'Bob': {'ham sandwiches': 3, 'apples': 2},
'Carol': {'cups': 3, 'apple pies': 1}}
def totalBrought(guests, item):
numBrought = 0
for k, v in guests.items():
numBrought = numBrought + v.get(item, 0)
return numBrought
print('Number of things being brought:')
print(' - Apples ' + str(totalBrought(allGuests, 'apples')))
print(' - Cups ' + str(totalBrought(allGuests, 'cups')))
print(' - Cakes ' + str(totalBrought(allGuests, 'cakes')))
print(' - Ham Sandwiches ' + str(totalBrought(allGuests, 'ham sandwiches')))
print(' - Apple Pies ' + str(totalBrought(allGuests, 'apple pies')))
首先观察源字典的数据结构发现是嵌套字典,我们要读取其中某一项物品的总和。建立函数,利用多重赋值与items( )读取字典中的键值对,利用get( )获取物品的值,利用增强赋值操作符进行迭代。
执行结果:
Number of things being brought:
- Apples 7
- Cups 3
- Cakes 0
- Ham Sandwiches 3
- Apple Pies 1