python快速上手_第五章 字典

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mike_Cui_LS/article/details/83149543

字典数据类型

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


小结

  • 列表和字典,可以包含多个值,包括其他列表和字典。
  • 列表是有序的,字典是不排序的。字典中的值时通过键来访问的。
  • 字典的键不只可以使用整数,可以用各种数据类型,整型、浮点型、字符串或元组。

猜你喜欢

转载自blog.csdn.net/mike_Cui_LS/article/details/83149543