python字典最佳实践

本篇教程部分内容超出现在所学知识范围,但并没有超出你的能力范围,对于字典的遍历,我将放到for循环章节中进行讲解,对于新知识,你应当抱有学习的热情,主动搜索资料学习他们,积极探索,是掌握一门编程语言的最佳路径。

1. 直接取值有风险,建议使用get方法

直接从字典里取值,面临一定的风险,比如下面的代码

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

print(score_dict['小丽'])

程序会报错

Traceback (most recent call last):
  File "/Users/zhangdongsheng/experiment/test/test.py", line 7, in <module>
    print(score_dict['小丽'])
KeyError: '小丽'

使用一个在字典中不存在的key,会引发异常,为了避免这种异常,通常有两种方法,先来说第一种方法

判断key是否存在

在使用key之前,先判断这个key是否存在,存在了取值,不存在则根据业务要求采取对应的措施

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

if '小丽' in score_dict:
    print(score_dict['小丽'])
else:
    print("字典里没有小丽的分数")

使用get方法

字典的get方法是非常实用的方法,该方法可以指定两个参数,一个是key,另一个是key不存在时返回的数据,默认范围None

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

print(score_dict.get('小丽'))

上面的代码中,要获取'小丽'这个key所对应的value,但是'小丽'不存在于字典中,因此get方法默认返回None,如果你希望get方法在key不存在时返回0,你可以这样写

print(score_dict.get('小丽', 0))

2. 不要用bool类型数据做key

bool类型是int类型的子类,1和 Ture是相等,0和False是相等的,如果使用字典时,1已经做了key,那么你再用True去做key,就会修改1所对应的value,下面是一个简单示例

int_dict = {
    1: '1做key',
    True: 'True做key'
}

print(int_dict)

执行代码,输出结果为

{1: 'True做key'}

3. 使用dict.setdefault方法

一个列表里存放了若干个单词

lst = ['']

现在要求你统计每个单词出现的次数,并将单词与单词出现的次数存储到字典中

你可以这样实现代码

lst = ['green', 'white', 'black', 'white', 'green', 'green']

info = {}

for word in lst:
    if word not in info:
        info[word] = 0

    info[word] += 1

print(info)

上面的代码虽然完成了要求,但是不够优雅,不符合python一贯的简洁作风,你应该使用setdefault方法让代码看起来更加简洁

lst = ['green', 'white', 'black', 'white', 'green', 'green']

info = {}

for word in lst:
    info.setdefault(word, 0)
    info[word] += 1

print(info)

setdefault方法尝试为key设置默认值,如果这个key已经存在,那么setdefault什么都不做,如果key不存在,则向字典里新增一个key-value键值对,value就是方法里的第二个参数。

上面的代码里,如果单词不存在于字典中,则设置这个单词所对应的value为0,info[word] += 1 等价于 info[word] = info[word] + 1 ,实现了单词出现次数加1的目的

4. 使用items()方法遍历字典

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

现在要求你输出字典里每一个学生的姓名和分数,你可以使用for循环来完成这个题目

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

for key in score_dict:
    print(key, score_dict[key])

上面的代码,不够优雅,建议你使用items()方法来实现遍历

score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

for key, value in score_dict.items():
    print(key, value)

代码看起来是不是简明一些呢,省去了使用key获取value的过程,items()方法返回一个可迭代对象,使用for循环遍历这个可迭代对象时,得到的是一个元组,元组内包含key和 value

下面的代码向你揭示items()方法返回的对象的本质面目

from collections import Iterable
score_dict = {
    '小明': 96,
    '小刚': 98,
    '小红': 94
}

iter_obj = score_dict.items()
print(isinstance(iter_obj, Iterable))

for item in iter_obj:
    print(item)

程序输出结果为

True
('小明', 96)
('小刚', 98)
('小红', 94)

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案