相关文章推荐
满身肌肉的高山  ·  spring security ...·  1 年前    · 
稳重的包子  ·  python - Undetected ...·  1 年前    · 
06.Python中的字典与JSON数据

06.Python中的字典与JSON数据

字典

之前已经介绍过了Python中的 列表 元组 集合 等数据存储结构类型了,而这次的字典则是一种更为准确地存储方式,它可以存储多个类型的数据,例如一个学生的信息:姓名、性别、年龄、身高、体重、住址、联系方式等等,如果用列表和元组、集合来处理,就显得有些鸡肋了。

person1 = ['xxx', 50, 50, '科华北路62号', '中同仁路8号', '13122334455', '13800998877']
person2 = ('xxx', 50, 50, '科华北路62号', '中同仁路8号', '13122334455', '13800998877')
person3 = {'xxx', 50, 50, '科华北路62号', '中同仁路8号', '13122334455', '13800998877'}

集合是不允许出现重复元素的,比如我想记录该同学的成绩,若两门成绩相同,则会被去掉一项,故,这时候用集合就不行了;元组本身就不允许更改里面的元素,也不太适合;最后列表倒是能满足,但是涉及到更加多的层次的时候例如:学生的成绩这一项元素里面还有其他学科的成绩的时候。这个时候就需要用到 字典 了。

Python中的字典跟生活中昂的字典类似,一个词有着它的一个意思的解释。字典的元素是由 键值对 构成的,冒号前面的称为键;冒号后面的称为值,合在一起就叫做键值对。

注: 字典中的键是不可变类型,字典中可以是任意类型。
"""
字典 ---> 元素由键和值两部分构成,冒号前面的称为键,冒号后面的成为值,合在一起叫键值对。
Author: 王浪
Date: 2021/7/29
student = {
    '学号': '01',
    '姓名': '王浪',
    '性别': '男',
    '出生日期': '2000-9',
    '现居住地': '成都',
    # 字典里面放列表
    '爱好': ['游泳', '篮球', '旅游'],
    # 字典里面放字典
    '联系方式': {
        'QQ': '450848490',
        '电话': '18284623836',
        '邮箱': '450848490@qq.com'
print(student['姓名'])
print(student['性别'])
print(student['联系方式']['电话'])
for fav in student['爱好']:
    print(fav)

创建字典

Python中创建字典使用 {} 字面量语法,字典中的元素是以键值对的形式存在;也可以用Python的函数 zip 来压缩两个序列并创建字典;最后就是用字典的生成式语法来创建字典。如下所示:

"""
字典的创建
Author: 王浪
Date: 2021/7/30
# 字面量语法
student1 = {
    'id': 1001,
    'name': '王浪',
    'sex': '男',
    'birthday': '2000-11'
print(student1)
print('-' * 20)
# 可以通过Python内置函数zip压缩两个序列并创建字典
items1 = dict(zip('ABCDE', '12345'))
print(items1)    # {'A': '1', 'B': '2', 'C': '3', 'D': '4', 'E': '5'}
items2 = dict(zip('ABCDE', range(1, 10)))
print(items2)    # {'A': 1, 'B': 2, 'C': 3, 'D': 4, 'E': 5}
print('-' * 20)
# 构造器语法 dict
student2 = dict(id=1002, name='马可波罗', sex='男', birthday='1990-1-1')
print(student2)
print('-' * 20)
# 生成式(推导式语法)
list1 = [i for i in range(1, 10)]
print(list1)
set1 = {i for i in range(1, 10)}
print(set1)
dict1 = {i: i ** 2 for i in range(1, 10)}
print(dict1)
print('-' * 50)

遍历字典

同列表一样,字典也是可以遍历所有元素的。

遍历字典中的 键

keys() 是字典的函数,可以实现对 查找。

# 遍历字典中的 键  key()
# for key in student1:
for key in student1.keys():
    print(key, student1[key])
print('-' * 20)

遍历字典中的 值

同样 value() 是字典中可以实现对 的查找

# 遍历字典中的 值  values()
for value in student1.values():
    print(value)
print('-' * 20)

遍历字典中的 键值对

items() 可以找到字典中的元素(以键值对形式存在)

# 遍历字典中的 键值对  items()
for key, value in student1.items():
    print(key, value)
print('-' * 20)

字典的相关操作

字典里面可以在放子典、列表等。字典同其他存储结构一样,包括索引运算、成员运算、增删、合并等。其中 索引运算 尤为重要。

字典的运算

"""
字典的运算
Author: 王浪
Date: 2021/7/30
student = dict(id=1002, name='王大锤', sex='男',birthday='1999-9-9')
# 字典的索引运算放在赋值运算符的左边
# 如果索引对应的键是存在的,就更新它的值
student['name'] = '王昭君'
student['sex'] = '女'
# 如果字典中没有对应的索引,增加一组新的“键值对”
student['address'] = '四川成都'
print(student)
print('-' * 50)
# 成员运算
print('name' in student)
print('sex' in student)
print('age' in student)
print('-' * 50)
# 使用get函数通过key获取value时,如果key不存在,不会发生KeyError错误,
# 而是默认返回一个None值,或者是你指定的默认值
print(student.get('age'))
print(student.get('age', 20))  # 指定返回的值 20
print(student.get('name', '无名氏'))  # key 键存在,获取它的 value 值
print('-' * 20)
# 如果要使用下标(索引)运算,那么必须要保证 键 一定存在
if 'birthday' in student:
    print(student['birthday'])
print('-' * 20)
# 删除键值对
del student['name']
print(student.get('name', '无名氏'))

字典的合并与删除

"""
Author: 王浪
Date: 2021/7/30
dict1 = {'A': 1, 'B': 2, 'C': 3}
dict2 = {'D': 4, 'E': 5, 'F': 6, 'A': 100}
# 合并元素,有相同 键 的做更新 value 值处理
dict1.update(dict2)
print(dict1)
print('-' * 50)
# 删除 ---> 键 必须存在,如果不存在会产生 KeyError
# del dict['B']
dict1.pop('B')
dict1.popitem()
print(dict1)
print('-' * 20)
# setdefault 可以向字典中存入新的键值对,或者取出已有键的 值
print(dict1.setdefault('C'))
dict1.setdefault('K', 1000)
print(dict1)

举个栗子

1.输入一段话,统计每个英文字母出现的次数。(大小写算同一个字母)

"""
输入一段话,统计每个英文字母出现的次数。(大小写算同一个字母)
Man is distinguished, not only by his reason,
but by this singular passion from other animals,
which is a lust of the mind,
that by a perseverance of delight in the continued and indefatigable generation of knowledge,
exceeds the short vehemence of any carnal pleasure.
Author: 王浪
Date: 2021/7/30
import string
# 默认大小写是同一个字母,创建一个 26 字母字典
results = {letter: 0 for letter in string.ascii_lowercase}
print(results)
content = input('请输入:').lower()
# 找到一个字母。该字母次数加一
for ch in content:
    if ch in results:
        results[ch] += 1
# print(results)
for key, value in results.items():
    print(f'{key}: {value:>2d}次')

2.字典中保存了股票信息,完成下面的操作

1.找出股票价格大于100元的股 票并创建一个新的字典
2.找出价格最高和最低的股票对应的股票代码
3.按照股票价格从高到低给股票代码排序
Author: 王浪
Date: 2021/7/30
stocks = {
    'AAPL': 191.88,
    'GOOG': 1186.96,
    'IBM': 149.24,
    'ORCL': 48.44,
    'ACN': 166.89,
    'FB': 208.09,
    'SYMC': 21.29
# 反转 键 和 值 zip ---> 压缩
re_stocks = dict(zip(stocks.values(), stocks.keys()))
print(re_stocks)
print('-' * 20)
# 1.找出股票价格大于100元的股 票并创建一个新的字典
new_stocks = {key: value for key, value in stocks.items() if value > 100}
print(new_stocks)
print('-' * 20)
# 2.找出价格最高和最低的股票对应的股票代码 zip ---> 压缩
print(max(zip(stocks.values(), stocks.keys()))[1])
print(min(zip(stocks.values(), stocks.keys()))[1])# 生成的是一个二元组,找下标即可
# max(stocks, key=stocks.get) 可直接比较字典中 value 的值
print(max(stocks, key=stocks.get))
print(min(stocks, key=stocks.get))
print('-' * 20)
# 3.按照股票价格从高到低给股票代码排序
print(sorted(stocks, key=stocks.get, reverse=True))
print('-' * 20)

JSON数据

json是一种数据结构,JSON就是一串字符串 只不过元素会使用特定的符号标注。

{} 双括号表示对象

[] 中括号表示数组

"" 双引号内是属性或值

: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)

1. 两个异构的系统之间交换数据最好的选择是交换纯文本(可以屏蔽系统和编程语言的差异)
2. 纯文本应该是结构化或半结构化的纯文本(有一定的格式)
    ~ XML ---> eXtensible Markup Language ---> 可扩展标记语言
    ~ JSON ---> JavaScript Object Notation ---> 大多数网站和数据接口服务使用的数据格式
    ~ YAML ---> Yet Another Markup Language

URL ---> Universal Resource Locator ---> 统一资源定位符

获取JSON数据

打开命令符输入(Win + R,输入 cmd 然后确定)

pip config set global.index-url pypi.doubanio.com/simpl (豆瓣网接口下载包)

首先需要安装第三方库,在终端(Terminal)写如下内容:

pip install requests

Python中需要调用接口来获取JSON数据,使用第三方库 requests 来实现获取数据,用Python中的 json 函数将获取到的JSON数据转换为 字典 ,在遍历你想要内容(键或者值)。

如下所示:

"""
联网获取JSON格式的数据并解析出需要的内容
三方库 ---> requests ---> pip install requests
协议 ---> 通信双方需要遵守的协议。
HTTP / HTTPS ---> 通过URL访问网络资源的协议 ---> Hyper-Text Transfer Protocol(超文本传输协议)
请求(request) - 响应(response)
Author: 王浪
Date: 2021/7/30
import json
import pprint
import requests
# # 第一种方法    英语的 url+'?',key=,&num=获取数据的条数。
# requests.get('http://api.tianapi.com/txapi/dialogue/index?'
#              'key=4d0466dc6caabb4a9d1cea59d60057cb&num=10')
# 第二种方法
resp = requests.get(
    url='http://api.tianapi.com/txapi/dialogue/index',
    params={'key': '4d0466dc6caabb4a9d1cea59d60057cb', 'num': 30}
# news_dict = json.loads(resp.text)
# 从响应中获取JSON数据直接转成字典
news_dict = resp.json()