Python理论5 字典与结构化数据

字典的数据类型

和列表一样,字典也是许多值的集合。但是与列表索引不同,字典索引可以使用许多不同的数据类型,而不仅仅是整数。字典的索引称为键,具有关联值的键称为键值对,每个键值对中的两个值以冒号连接,前者为键,后者为值,键值对间用逗号隔开。

>>> 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( )

利用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( )

利用values( )和for循环可以遍历字典中的所有值。

>>> for v in spam.values():
        print(v)

red
42

items( )

利用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一一对应字典中的键和值。

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

其中最后一个等价于于 ‘color’ 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.'

在这串代码中,由于picnicitems中有键cups所以返回cups所对应的值2,由于该字典中没有键eggs所以返回get( )指定的返回值0。

setdefault( )

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模块

模块中的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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值