字典数据类型
python中的字典,类似于java中的 Map。以键值对的形式存储。
字典的索引不只是整数,可以是不同的数据类型。 字典的索引被称为’键’ 。 键和值称为 ‘键-值’对。
字典输入时是 {}
>>> mycat = {'size':'fat','color':'gray','disposition':'loud'}
>>> mycat
{'size': 'fat', 'color': 'gray', 'disposition': 'loud'}
可以通过键来访问这些值:
>>> mycat['color']
'gray'
>>> 'My cat has '+mycat['color'] + ' fur'
'My cat has gray fur'
字典与列表
列表是排序的, 字典是不排序的。在列表中,表项的顺序很重要;在字典中,键 - 值对输入的顺序并不重要。
字典是不排序的,所以字典不能像列表那样切片。
>>> spam = ['a','b','c']
>>> bacon = ['b','c','a']
>>> spam == bacon
False
>>> eggs = {'a':'a1','b':'b1'}
>>> ham = {'b':'b1','a':'a1'}
>>> eggs == ham
True
尝试访问不存在的键时,会报错 KeyError
>>> spam = {'name':'mike','age':7}
>>> spam['age']
7
>>> spam['sex']
Traceback (most recent call last):
File "<pyshell#280>", line 1, in <module>
spam['sex']
KeyError: 'sex'
字典是不排序的,并可以使用任意值为键,这样可以更好的来组织数据
下面是用字典来存储朋友的生日的小程序:
birthdays = {'Alice':'Apr 1','Bob':'Dec 12','Mike':'Sep 14'}
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 bithday information for '+name)
print('What is their birthday?')
bday = input()
birthdays[name] = bday
print('Birthday database updated')
keys()、values()和items()方法
这三个方法返回类似列表的值, 分别是 字典的键、值 和 键 - 值对。
返回的并不是真正的列表,它们不能被修改,没有 append()方法。但是可用于 for 循环。
字典的遍历,类似于Java中的Map的遍历, 可以获取到 key的集合,value的集合,以及 key 和value封装的实体
循环获取每个值
>>> spam = {'color':'red','age':42}
>>> for v in spam.values():
print(v)
red
42
循环获取每个键
>>> for k in spam.keys():
print(k)
color
age
获取键值对
>>> for i in spam.items():
print(i)
('color', 'red')
('age', 42)
这些返回的并不是真正的列表,没有append方法,会报错AttributeError:
>>> spam.keys().append('a')
Traceback (most recent call last):
File "<pyshell#294>", line 1, in <module>
spam.keys().append('a')
AttributeError: 'dict_keys' object has no attribute 'append'
如果希望得到一个真正的列表,可以通过 list()函数进行转换。
>>> spam = {'color':'red','age':42}
>>> spam.keys()
dict_keys(['color', 'age'])
>>> newSpamKey = list(spam.keys())
>>> newSpamKey
['color', 'age']
>>> newSpamKey.append('Hello')
>>> newSpamKey
['color', 'age', 'Hello']
字典遍历之多重赋值
>>> spam
{'color': 'red', 'age': 42}
>>> for k,v in spam.items():
print('Key : '+k + ' Value : '+str(v))
Key : color Value : red
Key : age Value : 42
检查字典中是否存在键或值
我们之前用 in 和 not in 来检查某个值是否在列表中。 这两个操作符同样可用于字典中, 检查某个键或者值是否在字典中。
>>> spam = {'name':'Alice','age':20}
>>> 'name' in spam.keys()
True
>>> 20 in spam.values()
True
>>> 'name' in spam
True
>>> 'Bob' not in spam.keys()
True
in spam 等同于 in spam.keys().
get()方法
在访问一个键之前,检查该键是否在字典中,这比较麻烦。 可以使用 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.'
因为字典中没有 key 为 eggs的 value,所以会返回 0 。 如果不使用这种方式, 直接去获取一个不存在的键,会报错。
setdefault()方法
我们常常会判断是否在字典里有某个键,如果没有,则存入一个默认值。例如下面的代码:
>>> spam = {'name':'Alice','age':5}
>>> if 'color' not in spam:
spam['color'] = 'black'
>>> spam
{'name': 'Alice', 'age': 5, 'color': 'black'}
setdefault()方法就很好的解决了这个问题, 传入两个参数, 第一个参数,是要检查的键。第二个参数,是如果该键不存在时要设置的值。如果该键存在,方法就会返回该键的值。
>>> spam = {'name':'Alice','age':5}
>>> spam.setdefault('color','red')
'red'
>>> spam
{'name': 'Alice', 'age': 5, 'color': 'red'}
>>> spam.setdefault('color','white')
'red'
>>> spam
{'name': 'Alice', 'age': 5, 'color': 'red'}
可以确保只有一个键存在。
下面有一个程序,统计每个字符出现的次数。
message = 'It was a nice day in April, and the clocks were strinking thirteen'
count = {}
for character in message:
count.setdefault(character,0)
count[character] = count[character] + 1
print(count)
漂亮打印
需要导入 pprint 模块。 就可以使用 pprint 函数 和 pformat 函数。它们将‘漂亮的打印’一个字典。
import pprint
message = 'It was a nice day in April, and the clocks were strinking thirteen'
count = {}
for character in message:
count.setdefault(character,0)
count[character] = count[character] + 1
pprint.pprint(count)
打印结果:
{' ': 12,
',': 1,
'A': 1,
'I': 1,
'a': 4,
'c': 3,
'd': 2,
'e': 6,
'g': 1,
'h': 2,
'i': 6,
'k': 2,
'l': 2,
'n': 6,
'o': 1,
'p': 1,
'r': 4,
's': 3,
't': 5,
'w': 2,
'y': 1}
如果希望得到漂亮打印的文本作为字符串,而不是显示在屏幕上, 那可以调用 pprint.pformat().
#pprint.pprint(count)
#print(pprint.pformat(count))
这俩是等价的。
嵌套的字典和列表
对于现实生活中的情况 进行数据建模。当你对复杂的事物建模时,可能发现字典和列表中需要包含其他字典和列表,列表适用于包含一组有序的值,字典适合于包含关联的键和值。
下面的程序使用字典包含其他字典,用来记录谁为野餐带来了什么食物, totalBrought() 函数可以读取这个数据结构,计算所有客人带来的食物的总数。
allGuests = {'Alice':{'apples':5,'pretzels':12},
'Bob':{'ham sandwiches':3, 'apples':3},
'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(' - Apples '+str(totalBrought(allGuests,'apples')))
print(' - pretzels '+str(totalBrought(allGuests,'pretzels')))
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')))
打印结果:
- Apples 8
- pretzels 12
- cups 3
- cakes 0
- ham sandwiches 3
- apple pies 1
小结
- 列表和字典,可以包含多个值,包括其他列表和字典。
- 列表是有序的,字典是不排序的。字典中的值时通过键来访问的。
- 字典的键不只可以使用整数,可以用各种数据类型,整型、浮点型、字符串或元组。