集智专栏
资源加载中,请稍后...
集智专栏

[2018.03.08直播] Python之字典

Kaiser

直播地址:

负基础学Python之字典

Bilibili Live

伟东云学堂

往期回顾:

第1集:

视频:负基础入门Python(1)

文章:[2018.02.10直播] Python之禅

第2集:

视频:负基础入门Python(2)

文章:[2018.02.12直播] Python之循环

第3集:

视频:负基础入门Python(3)

文章:[2018.02.12直播] Python之函数

第4集:

视频:负基础入门Python(4)

文章:[2018.03.01直播] Python之列表

第5集

视频:负基础入门Python(5)

文章:[2018.03.01直播] Python之查找与排序



15. 字典

程序说明
Dictionary
示例代码
# 新建空字典 dict_empty1 = {} dict_empty2 = dict() # 新建字典 hans = {"及时雨":"宋江", "玉麒麟":"卢俊义", "智多星":"吴用", "入云龙":"公孙胜", "大刀":"关胜", "豹子头":"林冲"} # 访问字典内元素 hans[0]
程序验证过程
True


  • {}

    • 花括号,定义字典的标识符
  • ,

    • 逗号,键值对之间的分隔符
  • :

    • 冒号,键与值之间的分隔符


15.1 键(key)-值(value)

键值对的结构和Windows的注册表有些类似,注意,key:value这一个对内容加起来,才是字典的一项。列表的索引是整数,字典的索引(键)类型更加灵活。

程序说明
Key-Value pair
示例代码
hans = {"及时雨":"宋江", "玉麒麟":"卢俊义", "智多星":"吴用", "入云龙":"公孙胜", "大刀":"关胜", "豹子头":"林冲"} print("Keys: ", hans.keys()) print("Values: ", hans.values())


注册表注册表


15.2 映射

字典是key->value的映射,不同的键可以指向同样的值,但每个键只能映射到一个值。

程序说明
Mapping
示例代码
hans2 = {"及时雨":"宋江", "玉麒麟":"宋江", "智多星":"宋江", "入云龙":"宋江", "大刀":"宋江", "豹子头":"宋江"} hans3 = {"及时雨":"宋江", "及时雨":"卢俊义", "及时雨":"吴用", "及时雨":"公孙胜", "及时雨":"关胜", "及时雨":"林冲"} print("hans2['豹子头'] ", hans2["豹子头"]) print("hans2['及时雨'] ", hans3["及时雨"])
程序验证过程
True


15.3 字典的值

字典的值除了可以是数值、布尔值、字符串等数据,也可以是数据容器如列表,字典本身也可以作为字典的值,即嵌套字典。

Quiz 10. 字典嵌套

我们通过聚合数据天气API获取当天(2018年3月8日)的天气情况,返回的结果即是字典:

{'error_code': 0,
 'reason': 'successed!',
 'result': {'future': [{'date': '20180308',
    'temperature': '-4℃~7℃',
    'weather': '晴',
    'weather_id': {'fa': '00', 'fb': '00'},
    'week': '星期四',
    'wind': '东北风微风'},
   {'date': '20180309',
    'temperature': '-2℃~10℃',
    'weather': '多云',
    'weather_id': {'fa': '01', 'fb': '01'},
    'week': '星期五',
    'wind': '南风微风'},
   {'date': '20180310',
    'temperature': '-2℃~12℃',
    'weather': '晴',
    'weather_id': {'fa': '00', 'fb': '00'},
    'week': '星期六',
    'wind': '东南风微风'},
   {'date': '20180311',
    'temperature': '-1℃~11℃',
    'weather': '多云转晴',
    'weather_id': {'fa': '01', 'fb': '00'},
    'week': '星期日',
    'wind': '东南风微风'},
   {'date': '20180312',
    'temperature': '3℃~14℃',
    'weather': '晴',
    'weather_id': {'fa': '00', 'fb': '00'},
    'week': '星期一',
    'wind': '南风微风'},
   {'date': '20180313',
    'temperature': '-2℃~12℃',
    'weather': '晴',
    'weather_id': {'fa': '00', 'fb': '00'},
    'week': '星期二',
    'wind': '东南风微风'},
   {'date': '20180314',
    'temperature': '-2℃~10℃',
    'weather': '多云',
    'weather_id': {'fa': '01', 'fb': '01'},
    'week': '星期三',
    'wind': '南风微风'}],
  'sk': {'humidity': '27%',
   'temp': '4',
   'time': '13:06',
   'wind_direction': '西南风',
   'wind_strength': '4级'},
  'today': {'city': '北京',
   'comfort_index': '',
   'date_y': '2018年03月08日',
   'dressing_advice': '建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。',
   'dressing_index': '较冷',
   'drying_index': '',
   'exercise_index': '较不宜',
   'temperature': '-4℃~7℃',
   'travel_index': '较不宜',
   'uv_index': '中等',
   'wash_index': '较适宜',
   'weather': '晴',
   'weather_id': {'fa': '00', 'fb': '00'},
   'week': '星期四',
   'wind': '东北风微风'}},
 'resultcode': '200'}


Quiz 10.1

  • 以上字典结构数据已经存为变量weather
  • 请获取result值内含的键,将其赋值给变量result_keys
程序说明
查看字典结构
预处理代码
weather = {'error_code': 0, 'reason': '查询成功', 'result': {'future': [{'date': '20180308', 'temperature': '-4℃~7℃', 'weather': '晴', 'weather_id': {'fa': '00', 'fb': '00'}, 'week': '星期四', 'wind': '南风微风'}, {'date': '20180309', 'temperature': '-2℃~10℃', 'weather': '多云', 'weather_id': {'fa': '01', 'fb': '01'}, 'week': '星期五', 'wind': '东北风微风'}, {'date': '20180310', 'temperature': '-2℃~14℃', 'weather': '晴', 'weather_id': {'fa': '00', 'fb': '00'}, 'week': '星期六', 'wind': '东南风微风'}, {'date': '20180311', 'temperature': '0℃~12℃', 'weather': '多云转晴', 'weather_id': {'fa': '01', 'fb': '00'}, 'week': '星期日', 'wind': '北风微风'}, {'date': '20180312', 'temperature': '2℃~15℃', 'weather': '晴', 'weather_id': {'fa': '00', 'fb': '00'}, 'week': '星期一', 'wind': '北风微风'}, {'date': '20180313', 'temperature': '-2℃~14℃', 'weather': '晴', 'weather_id': {'fa': '00', 'fb': '00'}, 'week': '星期二', 'wind': '东南风微风'}, {'date': '20180314', 'temperature': '-2℃~10℃', 'weather': '多云', 'weather_id': {'fa': '01', 'fb': '01'}, 'week': '星期三', 'wind': '东北风微风'}], 'sk': {'humidity': '30%', 'temp': '6', 'time': '18:07', 'wind_direction': '西南风', 'wind_strength': '4级'}, 'today': {'city': '北京', 'comfort_index': '', 'date_y': '2018年03月08日', 'dressing_advice': '建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。', 'dressing_index': '较冷', 'drying_index': '', 'exercise_index': '较不宜', 'temperature': '-4℃~7℃', 'travel_index': '较不宜', 'uv_index': '中等', 'wash_index': '较适宜', 'weather': '晴', 'weather_id': {'fa': '00', 'fb': '00'}, 'week': '星期四', 'wind': '南风微风'}}, 'resultcode': '200'}
示例代码
''' 从聚合数据获取当日北京天气情况,以字典格式 import requests tar_url = "http://v.juhe.cn/weather/index?format=2&cityname=%e5%8c%97%e4%ba%ac&key=52f2d7d21cf8ac9e6ffeca02097d31d4" response = requests.get(tar_url) weather = response.json() ''' # >>>> show me the code <<<< result_keys = # >>>> show me the code <<<<
正确答案
result_keys = weather["result"].keys()
程序验证过程
"today" in weather["result"].keys()
提示信息
.keys()


Quiz 10.2

程序说明
Quiz 10.2
预处理代码
weather = {'error_code': 0, 'reason': 'successed!', 'result': {'future': [{'date': '20180308', 'temperature': '-4℃~7℃', 'weather': '晴', 'weather_id': {'fa': '00', 'fb': '00'}, 'week': '星期四', 'wind': '东北风微风'}, {'date': '20180309', 'temperature': '-2℃~10℃', 'weather': '多云', 'weather_id': {'fa': '01', 'fb': '01'}, 'week': '星期五', 'wind': '南风微风'}, {'date': '20180310', 'temperature': '-2℃~12℃', 'weather': '晴', 'weather_id': {'fa': '00', 'fb': '00'}, 'week': '星期六', 'wind': '东南风微风'}, {'date': '20180311', 'temperature': '-1℃~11℃', 'weather': '多云转晴', 'weather_id': {'fa': '01', 'fb': '00'}, 'week': '星期日', 'wind': '东南风微风'}, {'date': '20180312', 'temperature': '3℃~14℃', 'weather': '晴', 'weather_id': {'fa': '00', 'fb': '00'}, 'week': '星期一', 'wind': '南风微风'}, {'date': '20180313', 'temperature': '-2℃~12℃', 'weather': '晴', 'weather_id': {'fa': '00', 'fb': '00'}, 'week': '星期二', 'wind': '东南风微风'}, {'date': '20180314', 'temperature': '-2℃~10℃', 'weather': '多云', 'weather_id': {'fa': '01', 'fb': '01'}, 'week': '星期三', 'wind': '南风微风'}], 'sk': {'humidity': '27%', 'temp': '4', 'time': '13:06', 'wind_direction': '西南风', 'wind_strength': '4级'}, 'today': {'city': '北京', 'comfort_index': '', 'date_y': '2018年03月08日', 'dressing_advice': '建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。', 'dressing_index': '较冷', 'drying_index': '', 'exercise_index': '较不宜', 'temperature': '-4℃~7℃', 'travel_index': '较不宜', 'uv_index': '中等', 'wash_index': '较适宜', 'weather': '晴', 'weather_id': {'fa': '00', 'fb': '00'}, 'week': '星期四', 'wind': '东北风微风'}}, 'resultcode': '200'}
示例代码
''' 从聚合数据获取当日北京天气情况,以字典格式 import requests tar_url = "http://v.juhe.cn/weather/index?format=2&cityname=%e5%8c%97%e4%ba%ac&key=52f2d7d21cf8ac9e6ffeca02097d31d4" response = requests.get(tar_url) weather = response.json() ''' # >>>> show me the code <<<< dressing_advice = # >>>> show me the code <<<<
正确答案
dressing_advice = weather['results']['today']['dressing_advice']
程序验证过程
dressing_advice == weather['results']['today']['dressing_advice']
提示信息
weather['results']['today']['dressing_advice']


15.4 字典与控制流

  • in/not in 针对的是字典结构的键,而不是值。
  • 对字典做for循环,迭代器是字典的键,而不是值。
程序说明
in dict
示例代码
hans = {"及时雨":"宋江", "玉麒麟":"卢俊义", "智多星":"吴用", "入云龙":"公孙胜", "大刀":"关胜", "豹子头":"林冲"} print('"及时雨" in hans = ', "及时雨" in hans) print('"宋江" in hans = ', "宋江" in hans) print('"宋江" in hans.values() = ', "宋江" in hans.values()) for key in hans: print(key)
程序验证过程
True


16. 字典的键

作为键的值必须是可散列(hashable)的,而列表(list)、字典(dict)都是可变容器,不可散列,因此列表和字典自身不能作为字典的键。

程序说明
Key
示例代码
tiangang = {["宋江", "卢俊义", "吴用", "公孙胜", "林冲", "关胜"]:"天罡"} tiangang2 = {"天罡":["宋江", "卢俊义", "吴用", "公孙胜", "林冲", "关胜"]} print(tiangang2)
程序验证过程
True


17. 字典方法

17.1 键-值

  • .keys()

    • 字典的所有键
  • .values()

    • 字典的所有值

注意s


17.2 删除字典元素

程序说明
删除字典元素
示例代码
hans = {"及时雨":"宋江", "玉麒麟":"卢俊义", "智多星":"吴用", "入云龙":"公孙胜", "大刀":"关胜", "豹子头":"林冲"} guansheng = hans.pop("大刀") print("hans.pop('大刀') = ", guansheng) print("after pop(): ", hans) del hans["豹子头"] print("\nafter del: ", hans)
程序验证过程
True


18. 字典应用

Quiz 11: 数位统计

圆周率$\pi$的前100位数字,组正一个列表:

['3', '1', '4', '1', '5', '9', '2', '6', '5', '3', '5', '8', '9', '7', '9', '3', '2', '3', '8', '4', '6', '2', '6', '4', '3', '3', '8', '3', '2', '7', '9', '5', '0', '2', '8', '8', '4', '1', '9', '7', '1', '6', '9', '3', '9', '9', '3', '7', '5', '1', '0', '5', '8', '2', '0', '9', '7', '4', '9', '4', '4', '5', '9', '2', '3', '0', '7', '8', '1', '6', '4', '0', '6', '2', '8', '6', '2', '0', '8', '9', '9', '8', '6', '2', '8', '0', '3', '4', '8', '2', '5', '3', '4', '2', '1', '1', '7', '0', '6', '7', '9']

  • 请统计该列表中0-9十位数字分别出现了多少次,存至字典型变量pi_counts,其中键为数字,值为出现次数。
程序说明
数位统计
示例代码
pi_lst = ['3', '1', '4', '1', '5', '9', '2', '6', '5', '3', '5', '8', '9', '7', '9', '3', '2', '3', '8', '4', '6', '2', '6', '4', '3', '3', '8', '3', '2', '7', '9', '5', '0', '2', '8', '8', '4', '1', '9', '7', '1', '6', '9', '3', '9', '9', '3', '7', '5', '1', '0', '5', '8', '2', '0', '9', '7', '4', '9', '4', '4', '5', '9', '2', '3', '0', '7', '8', '1', '6', '4', '0', '6', '2', '8', '6', '2', '0', '8', '9', '9', '8', '6', '2', '8', '0', '3', '4', '8', '2', '5', '3', '4', '2', '1', '1', '7', '0', '6', '7', '9'] pi_counts = {} # >>>> show me the code <<<< # >>>> show me the code <<<<
正确答案
for key in pi_lst: if key in pi_counts: pi_counts[key] += 1 else: pi_counts[key] = 1
程序验证过程
pi_counts == {'3': 12, '1': 8, '4': 10, '5': 8, '9': 14, '2': 12, '6': 9, '8': 12, '7': 8, '0': 8}
提示信息
循环判断列表pi_lst的元素是否已存在于字典pi_counts中,若是则对应值+1,否则=1。


19. 反转字典

等反转等反转


Quiz 10统计了每个数字的出现频次,接下来尝试统计出现了若干次的数字有哪些。比如$0, 1, 5, 7$都出现了8次,那么相应的键值对就是'8':[0,1,5,7]

Quiz 11. 数位统计-2

程序说明
数位统计-2
示例代码
pi_lst = ['3', '1', '4', '1', '5', '9', '2', '6', '5', '3', '5', '8', '9', '7', '9', '3', '2', '3', '8', '4', '6', '2', '6', '4', '3', '3', '8', '3', '2', '7', '9', '5', '0', '2', '8', '8', '4', '1', '9', '7', '1', '6', '9', '3', '9', '9', '3', '7', '5', '1', '0', '5', '8', '2', '0', '9', '7', '4', '9', '4', '4', '5', '9', '2', '3', '0', '7', '8', '1', '6', '4', '0', '6', '2', '8', '6', '2', '0', '8', '9', '9', '8', '6', '2', '8', '0', '3', '4', '8', '2', '5', '3', '4', '2', '1', '1', '7', '0', '6', '7', '9'] In [46]: pi_counts = {'3': 12, '1': 8, '4': 10, '5': 8, '9': 14, '2': 12, '6': 9, '8': 12, '7': 8, '0': 8} inverse = {} # >>>> show me the code <<<< # >>>> show me the code <<<<
正确答案
for key in pi_counts: val = pi_counts[key] if val not in inverse: inverse[val] = [key] else: inverse[val].append(key)
程序验证过程
inverse == {8: ['1', '5', '7', '0', '1', '5', '7', '0'], 9: ['6', '6'], 10: ['4', '4'], 12: ['3', '2', '8', '3', '2', '8'], 14: ['9', '9']}

您也许喜欢这些文章

集智专栏

[Python爬虫] 「暴力」破解猫眼电影票房数据的反爬虫机制

发表至趣味项目
一套完整的数据分析+机器学习流程,从数据获取(反爬虫机制),数据清洗到最终的机器学习与数据可视化。 猫眼电影票房数据(piaofang.maoyan.com)的反爬虫机制很有趣,是采用了来自美团网的加密字体系统,虽然前端人类读者看到的一切正常,但那是样式表渲染(相当于解密过程)的结果,而爬虫从后台得到的数据,都是密文。 作者直接绕过了破译密码,而是从模式识别的角度,由爬虫自动采集前端图像,再进行分割,最后只用支持向量机分类算法,获得真实的数字。
集智专栏

[Python入门] 02 控制流

发表至系列教程
Python入门系列的第二篇,本篇将介绍如何通过控制流编写结构较为复杂的程序。在多数Python程序中,最常用的控制流是if判断和for循环,最后再将for和if结合起来。
集智专栏

[Scikit-learn教程] 02.05 综合实践

发表至系列教程
将之前的统计学习相关内容整合到一起,来做一个人脸识别的应用算例。

文章评论(5)

粽宝宝 发表于 2月前回复
回复shiro:Quiz 10.2 是不是有bug,写的和答案一样但是不通过
我也发现了。。不知道为啥。。
新用户374 发表于 2月前回复
哈希hans中单引号和双引号有什么区别呢?
我可精神啦 发表于 3月前回复
# >>>> show me the code <<<< for val in pi_counts.values(): key = pi_counts.get(val) if key not in inverse: inverse[val] = [key] else: inverse[val].append(key) print(inverse) # >>>> show me the code <<<< 不知道哪里有问题
shiro 发表于 6月前回复
Quiz 10.2 是不是有bug,写的和答案一样但是不通过
future 发表于 6月前回复
最后一问 for val in pi_counts.values(): inverse[val] = [key for key in pi_counts if pi_counts[key] == val] print(inverse)