7.字典

1.字典与列表

不像列表, 字典中的表项是不排序的。在列表中, 表项的顺序很重要,但是在字典中, 键-值得顺序并不重要。
>>> spam = ['cats', 'dogs', 'moose']
>>> bacon = ['dogs', 'moose', 'cats']
>>> spam == bacon
False

>>> eggs = {'name': 'Zophie', 'species': 'cat', 'age': '8'}
>>> ham = {'species': 'cat', 'age': '8', 'name': 'Zophie'}
>>> eggs == ham
True 

2.keys(),values(),items()方法

有三个字典方法,分别返回类似列表的值,分别对应于字典的键、值、键-值对: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 v in spam.keys():
    print(v)
color
age

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

items()方法返回的dict_items之中, 包含的是键和值得元组
如果希望通过这些方法得到一个真正的列表, 就把类似列表的返回值传递给list函数。
 >>> spam.keys()
dict_keys(['color', 'age'])
>>> list(spam.keys())
['color', 'age']

也可以利用多重赋值的技巧, 在for循环中将键和值赋给不同的变量。
>>> 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

3.检查字典中是否存在键或值

前面有提到, 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
>>> 'name' in spam
True
>>> 'age' in spam
True
>>> 'color' in spam
False
    请注意,'name' in spam 本质上是一个简写版本, 相当于‘name’ in spam.keys(),这种情况总是对的:如果
想要检查一个值是否为字典中的键, 就可以用关键字in (或not in),作用于字典本身。

4.get()方法

    在访问一个键的值之前, 检查该键是否存在于字典中, 这很麻烦。好在, 字典存在一个get()方法,它有两个参数:要取得
其值的键, 以及如果该键不存在时,返回的备用值。
>>> picnicItem = {'apples': 5, 'cups': 2}
>>> 'I am bringing ' + str(picnicItem.get('cups', 0)) + ' cups'
'I am bringing 2 cups'
>>> 'I am bringing ' + str(picnicItem.get('apples', 0)) + ' apples'
'I am bringing 5 apples'
>>> 'I am bringing ' + str(picnicItem.get('eggs', 0)) + ' eggs'
'I am bringing 0 eggs'
  因为picnicItem字典中没有‘eggs’键,get()方法返回的默认值为0, 不使用get(), 代码就会产生一个错误,例如:
>>> 'I am bringing ' + str(picnicItem['eggs']) + ' eggs'
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    'I am bringing ' + str(picnicItem['eggs']) + ' eggs'
KeyError: 'eggs'

5.setdefault()方法

    你常常需要为字典中某个键值设置一个默认值, 当该键没有任何值使用它的时候。setdefault()方法提供了一种方式, 
在一行中完成这件事。 传递给该方法的第一个参数是要检查的键, 第二个参数, 是如果该键不存在时要设置的值, 如果该键确实存
在, 方法就会返回键的值。 
>>> spam = {'name': 'Pooka', 'age': 5}
>>> spam.setdefault('color', 'black')
'black'
>>> spam
{'name': 'Pooka', 'age': 5, 'color': 'black'}
>>> spam.setdefault('color', 'white')
'black'
>>> spam
{'name': 'Pooka', 'age': 5, 'color': 'black'}
    第一次调用setdefault()时,spam变量中字典的值变为{'name': 'Pooka', 'age': 5, 'color': 'black'}。该方法返回的
是‘black’, 因为现在该值被赋给键‘color’, 当spam.setdefault('color', 'white')被调用时, 该键的值“没有”被改为
‘white’, 因为spam变量已经有名为‘color’的键。
    setdefault()方法是一个很好的快捷方式, 可以确保一个键存在。

下面有一个小程序, 计算一个字符串中, 每个字符出现的次数。
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) 

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

6.漂亮打印

    如果程序中导入pprint模块, 就可以使用pprint() 和 pformat()函数, 它们将“漂亮打印”一个字典的值。 如果想要字典表项
的显示比print()的输出结果更干净, 这就有用了。修改前面小程序的代码如下:
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,
 '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()函数就特别有用。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。