master
/ 7.2.2 获取字典值.ipynb

7.2.2 获取字典值.ipynb @masterview markup · raw · history · blame

Notebook

获取字典值

字典是一种无序序列类型,不能使用**序号索引**的方式获取字典的值。
字典内部的数据具有“键”和“值”的映射关系,字典一般通过**“键”**来访问其“值”。 根据键值查询字典中的元素的速度很快,这是基于字典巨大的内存开销获得的,属于典型的空间换时间。

语法为:

dict[key]

实例 6.4 通讯录查询

构建一个字典,存储姓名和对应的电话号码

{'李明': '13988887777', '张宏': '13866668888', '吕京': '13143211234'}

利用这个字典开发一个简单的通讯录程序。具备简单的查询、更新、插入、删除等功能。

本节先实现查询的功能,实现输入一个姓名,查询对应的电话号码的功能。

In [2]:
# 用字典存储数据的通讯录程序,查询功能
phonebook_dict = {'李明': '13988887777', '张宏': '13866668888', '吕京': '13143211234'}

# 索引方法实现查询功能
name = input('请输入要查询的联系人姓名:')
print(name + ":" + phonebook_dict[name]) # 以输入的人名为键访问字典中该键对应的值
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/tmp/ipykernel_395/3945917760.py in <module>
      4 # 索引方法实现查询功能
      5 name = input('请输入要查询的联系人姓名:')
----> 6 print(name + ":" + phonebook_dict[name]) # 以输入的人名为键访问字典中该键对应的值

KeyError: '黎明'

使用dict[key]方法时,若字典中**不存在该键**,程序会抛出**KeyError异常**

In [ ]:
print(name + ":" + phonebook_dict['李小明'])  

为了避免在字典中取数据时出现访问不存在的键值导致的异常,使程序运行意外中止,可以**先判断键是否存在**,或使用异常处理。

修改后的完整实现代码如下:

In [3]:
def query(name):
    # 索引方法实现查询功能
    if name in phonebook_dict:                     # 为避免姓名不存在导致异常,先判断是否存在
        return name + ":" + phonebook_dict[name]   # 以输入的人名为键访问字典中该键对应的值
    else:
        return "联系人不存在"


if __name__ == '__main__':
    # 用字典存储数据的通讯录程序,查询功能
    phonebook_dict = {'李明': '13988887777', '张宏': '13866668888', '吕京': '13143211234'}
    Name = input('请输入要查询的联系人姓名:')
    print(query(Name))
联系人不存在

除此之外,还可以使用字典的内置方法**get()**来获取数据,其语法为:

dict.get(k[, default])

字典dict中存在以“k”为键的元素时,则返回值该键对应的值

In [4]:
print( phonebook_dict.get('李明')) 
13988887777

当字典dict中不存在以“k”为键的元素时,如果没有提供 default 参数,则返回空值 None

In [4]:
print(phonebook_dict.get('李小明')) 
None

当字典dict中不存在以“k”为键的元素时,如果提供了 default 参数,则返回default

In [15]:
print(phonebook_dict.get('李小明', '联系人不存在'))

建议在获取字典值时,尽可能使用**字典的get()方法**,可以避免键不存在时引发的错误。
用get()方法修改后的完整代码如下:

In [13]:
def query(name):
    # get()方法实现查询功能
    return name + ":" + phonebook_dict.get(name, '联系人不存在')   


if __name__ == '__main__':
    # 用字典存储数据的通讯录程序,查询功能
    phonebook_dict = {'李明': '13988887777', '张宏': '13866668888', '吕京': '13143211234'}
    Name = input('请输入要查询的联系人姓名:')
    print(query(Name))

根据年月查询该月天数

In [3]:
def leap(year: int) -> bool:
    """接收一个表示年份的整数,判定是否是闰年,返回布尔值 """
    return year % 400 == 0 or (year % 4 == 0 and year % 100 != 0)


def days_of_month(month: int, year: int) -> int:
    """接收一个表示月份的整数,返回该月的天数"""
    days_of_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    days_dic = dict(zip(range(1, 13), days_of_month))  # 构建每月天数字典
    days = days_dic.get(month)                         # 查询本月天数
    if leap(year) and month == 2:
        days = days + 1                                # 若为闰年2月,该月为29天
    return days


if __name__ == '__main__':
    today = input()  # 输入8位的年月日
    year = int(today[:4])
    month = int(today[4:6])
    print(days_of_month(month, year))

字典提供了内置方法**keys()****values()****items()**可以获取字典中所有的**“键”****“值”****“键-值”对**的视图。
返回值是一个**可迭代对象**,其中的**数据顺序确定**,数据顺序与加入顺序相同。
获取视图方法的描述如下表所示。

方法 描述
dict.keys() 获取字典dict中的所有键组成一个可迭代数据对象。
dict.values() 获取字典dict中的所有值组成一个可迭代数据对象。
dict.items() 获取字典dict中的所有键值对,两两组成元组,形成一个可迭代数据对象。
In [6]:
phonebook_dict = {'李明': '13988887777', '张宏': '13866668888', '吕京': '13143211234'}
# 返回可迭代对象,dict_keys(['李明', '张宏', '吕京'])
keys = phonebook_dict.keys()
# 返回可迭代对象,dict_values(['13988887777', '13866668888', '13143211234'])
values=phonebook_dict.values()
# 返回可迭代对象,dict_items([('李明', '13988887777'), ('张宏', '13866668888'), ('吕京', '13143211234')])
key_value_pairs=phonebook_dict.items()     
print(keys)       
print(values) 
print(key_value_pairs) 

上述3种方法返回值是**可迭代数据对象**,可对其进行**遍历**或用**list()将其转为列表**

In [8]:
phonebook_dict = {'李明': '13988887777', '张宏': '13866668888', '吕京': '13143211234'}
keys = list(phonebook_dict.keys())
print(keys)
for name in keys: #对可迭代对象dict_keys()进行遍历输出
    print(name)
for name,phone in phonebook_dict.items(): #对可迭代对象dict.items()进行遍历输出
    print(name+':'+phone)

在 Python 3.7 版以后,字典顺序会确保为插入顺序,所以这3个方法的返回值也都是有序数据,可以使用sorted()等应用于序列的方法对其进行操作。 但向.往中烈面添元素新键可能导致,使导致散列表中的键的次序发生。化.,此,不要在遍历字典的同时对进行典的。改.

In [10]:
city = {'北京': 1961, '重庆': 2885, '成都': 1405, '上海': 2302}
city_name = list(city.keys())                   # ['重庆', '上海', '北京', '成都']
total_population = sum(city.values())           # 可迭代对象可以直接做sum()的参数
print(f'城市列表:{city_name}')                 # 城市列表:['重庆','上海','北京','成都']
print(f'城市人口{total_population}万人')        # 城市人口8553万人
print(sorted(city.values()))                    # 排序输出[1405, 1961, 2302, 2885]
print(sorted(city.items(), key=lambda x:x[1]))  # 排序输出[('成都', 1405), ('北京', 1961), ('上海', 2302), ('重庆', 2885)]