书接上文,本篇继续来进行讲解Python常见数据类型。

J6cEdK.png

6. 字典(dict)

此处的字典和我们小时候用的新华字典大不同。

字典也可以当做是个容器,在内部可以存放数据。相比较于元组和列表,字典的元素必须是 键值对

注意:在Python3.6+字典就是有序了,之前的字典都是无需。

6.1 字典定义

以下这四种字典格式是项目中非常常见的四种定义方式

1
2
3
info = {"age":12, "status":True, "name":"szk","hobby":['篮球','足球']}

# 例如: "age":12 称为一个键值对。
1
2
3
4
5
6
7
8
department_dict = {
"IT部门":["szk","Pounds"],
"销售部":["张三","刘能","张扬"],
"财务部":["波姐"],
"xxx": 'xxx'
}

注意:一般情况字典的value值可以是任意数据类型
1
2
3
4
5
6
7
8
9
department_dict = {
"尚泽凯":{"id":1,"gender":"男","email":"xx@live.com"},
"Pounds":{"id":1,"gender":"男","email":"xx@live.com"},
"郭达":{"id":1,"gender":"男","email":"xx@live.com"},
"刘能":{"id":1,"gender":"男","email":"xx@live.com"},
"赵四":{"id":1,"gender":"男","email":"xx@live.com"},
"广坤":{"id":1,"gender":"男","email":"xx@live.com"},
...
}
1
2
3
4
5
6
7
8
9
10
11
12
user_info = [

{
'name':'szk',
'age':18
},
{
'name':'pounds',
'age':32
}

]

注意:字典的键有特殊要求,即:int/bool/str/tuple;不能使用的类型:list/dict

1
2
3
4
5
6
7
8
9
10
11
12
13
# 合法
dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帅
哥', '美⼥'], (1, 2, 3): '麻花藤'}
print(dic[123])
print(dic[True])
print(dic['id'])
print(dic['stu'])
print(dic[(1, 2, 3)])

# 不合法
# dic = {[1, 2, 3]: '周杰伦'} # list不能作为key
# dic = {{1: 2}: "哈哈哈"} # dict不能作为key
# dic = {{1, 2, 3}: '呵呵呵'} # set不能作为key

6.2 常见方法

  1. 所有的键
1
2
3
info = {"age":12, "status":True, "name":"szk","email":"xx@live.com"}
data = info.keys() # 获取字典的所有的键,返回一个`高仿的`列表,存放的都是字典中的key。
print(data) # 输出:dict_keys(['age', 'status', 'name', 'email'])
1
2
3
info = {"age":12, "status":True, "name":"szk","email":"xx@live.com"}
for ele in info.keys():
print(ele)

注意:在Python2中 字典.keys()直接获取到的是列表,而Python3中返回的是高仿列表,这个高仿的列表可以被循环显示。

  1. 所有的值
1
2
3
info = {"age":12, "status":True, "name":"szk","email":"xx@live.com"}
data = info.values()
print(data) # 输出:dict_values([12, True, 'szk', 'xx@live.com'])
1
2
3
info = {"age":12, "status":True, "name":"szk","email":"xx@live.com"}
for val in info.values():
print(val) # 输出:dict_values([12, True, 'szk', 'xx@live.com'])

注意:在Python2中 字典.values()直接获取到的是列表,而Python3中返回的是高仿列表,这个高仿的列表可以被循环显示。

  1. 所有的键值
1
2
3
info = {"age":12, "status":True, "name":"szk","email":"xx@live.com"}
data = info.items()
print(data) # 输出 dict_items([('age', 12), ('status', True), ('name', 'szk'), ('email', 'xx@live.com')])
1
2
for item in info.items():
print(item) # item是一个元组 (键,值)
1
2
for key,value in info.items():
print(key,value) # key代表键,value代表值,将兼职从元组中直接拆分出来了。
  1. 更新字典键值对
1
2
3
info = {"age":12, "status":True}
info.update({"age":14,"name":"szk"}) # info中没有的键直接添加;有的键则更新值
print(info) # 输出:{"age":14, "status":True,"name":"szk"}
  1. 移除字典的简直对
1
2
3
4
info = {"age":12, "status":True,"name":"szk"}
data = info.pop("age")
print(info) # {"age":12,"name":"szk"}
print(data) # 12
  1. 根据键获取值
1
2
3
info = {"age":12, "status":True,"name":"szk"}
data = info.get("name",None) # 根据name为键去info字典中获取对应的值,如果不存在则返回None,存在则返回值。
print(data) # 输出:szk

6.3 转换

由于字典的每一个元素是键值对,所以想要转换为字典的必须要有个特定的格式才能转换成功

1
2
v = dict([("k1","v1"),("k2","v2")])
print(v) # 输出:{'k2': 'v2', 'k1': 'v1'}
1
2
v = dict([ ["k1","v1"], ["k2","v2"] ])
print(v) # 输出:{'k2': 'v2', 'k1': 'v1'}

子元素必须包含两个元素,从而将值对应给字典的键、值。

6.4 其他

1.取长度

1
2
3
info = {"age":12, "status":True,"name":"szk"}
data = len(info)
print(data) # 输出:3

2.索引(键)
字典不同于元组和列表,字典的索引是,而列表和元组则是 0、1、2等数值

1
2
3
4
5
info = {"age":12, "status":True,"name":"szk"}
print(info["age"]) # 输出:12
print(info["name"]) # 输出:szk
print(info["status"]) # 输出:True
print(info["xxxx"]) # 报错,通过键为索引去获取之后时,键不存在会报错(以后项目开发时建议使用get方法根据键去获取值)

提示:字典根据键的查找速度非常快,远远大于列表或元组通过索引查找的速度,因为字典内部是基于hash存储。

3.根据键 修改值 和 添加值 和 删除键值对
上述示例通过键可以找到字典中的值,通过键也可以对字典进行添加和更新操作

1
2
3
info = {"age":12, "status":True,"name":"szk"}
info["gender"] = "男" # gender键在字典中不存在,则自动在字典中新添加一个键值对
print(info) # 输出: {"age":12, "status":True,"name":"szk","gender":"男"}
1
2
3
info = {"age":12, "status":True,"name":"szk"}
info["age"] = "18" # age键在info字典中已存在,则更新键对应的值
print(info) # 输出: {"age":18, "status":True,"name":"szk"}
1
2
3
info = {"age":12, "status":True,"name":"szk"}
del info["age"] # 删除info字典中键为age的那个键值对(键不存在则报错)
print(info) # 输出: {"status":True,"name":"szk"}

4.for循环
由于字典也属于是容器,内部可以包含多个键值对,可以通过循环对其中的:键、值、键值进行循环;

1
2
3
info = {"age":12, "status":True,"name":"szk"}
for item in info.key():
print(item)
1
2
3
info = {"age":12, "status":True,"name":"szk"}
for item in info.values():
print(item)
1
2
3
info = {"age":12, "status":True,"name":"szk"}
for key,value in info.items():
print(key,value)

5.字典嵌套
截止目前位置我们已学了:int/str/list/tuple/dict 五种常见数据类型,而其中list/tuple/dict类型中可以包含子元素,所以他们的内容就可以进行数据的嵌套。但在嵌套和对内部数据操作时要注意:元组子元素不能变不可哈希的list、dict不能做字典的键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
dic = {
'name':'汪峰',
'age':48,
'wife':[{'name':'国际章','age':38}],
'children':['第一个熊孩子','第二个熊孩子']
}
"""
1. 获取汪峰的妻子名字
d1 = dic['wife'][0]['name']
print(d1)
2. 获取汪峰的孩子们
d2 = dic['children']
print(d2)
3. 获取汪峰的第一个孩子
d3 = dic['children'][0]
print(d3)
4. 汪峰的媳妇姓名变更为 章子怡
dic['wife'][0]['name] = "章子怡"
print(dic)
5. 汪峰再娶一任妻子
dic['wife'].append({"name":"铁锤","age":19})
print(dic)
6. 给汪峰添加一个爱好:吹牛逼
dic['hobby'] = "吹牛逼"
print(dic)
7. 删除汪峰的年龄
del dic['age']

dic.pop('age')_
print(dic)
"""

练习题

  1. 根据需求写代码

    1
    2
    3
    4
    5
    dic = {'k1': "v1", "k2": "v2", "k3": [11,22,33]}
    请在字典中添加一个键值对,"k4": "v4",输出添加后的字典
    请在修改字典中 "k1" 对应的值为 "alex",输出修改后的字典
    请在k3对应的值中追加一个元素 44,输出修改后的字典
    请在k3对应的值的第 1 个位置插入个元素 18,输出修改后的字典
  2. 根据需求写代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    dic1 = {
    'name':['pounds',2,3,5],
    'job':'teacher',
    '51devops':{'szk':['python1','python2',100]}
    }
    1,将name对应的列表追加⼀个元素’xxx’。
    2,将name对应的列表中的 pounds ⾸字⺟⼤写。
    351devops 对应的字典加⼀个键值对 ’haoda’,’linux’。
    4,将51devops对应的字典中的szk对应的列表中的python2删除
  1. 判断以下值那个能做字典的key ?那个能做集合的元素?

    • 1
    • -1
    • “”
    • None
    • [1,2]
    • (1,)
    • {11,22,33,4}
    • {‘name’:’szk’,’age’:18}
  2. 将字典的键和值分别追加到 key_list 和 value_list 两个列表中,如:

    1
    2
    3
    key_list = []
    value_list = []
    info = {'k1':'v1','k2':'v2','k3':'v3'}
  3. 字典dic = {‘k1’: “v1”, “k2”: “v2”, “k3”: [11,22,33]}

    1
    2
    3
    4
    5
    6
    7
    a. 请循环输出所有的key
    b. 请循环输出所有的value
    c. 请循环输出所有的key和value
    d. 请在字典中添加一个键值对,"k4": "v4",输出添加后的字典
    e. 请在修改字典中 "k1" 对应的值为 "szk",输出修改后的字典
    f. 请在k3对应的值中追加一个元素 44,输出修改后的字典
    g. 请在k3对应的值的第 1 个位置插入个元素 18,输出修改后的字典
  4. 请循环打印k2对应的值中的每个元素。

    1
    2
    3
    4
    info = {
    'k1':'v1',
    'k2':[('pounds'),('szk'),('51devops')],
    }
  5. 输出商品列表,用户输入序号,显示用户选中的商品

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    """
    商品列表:
    goods = [
    {"name": "电脑", "price": 1999},
    {"name": "鼠标", "price": 10},
    {"name": "游艇", "price": 20},
    {"name": "美女", "price": 998}
    ]
    要求:
    1:页面显示 序号 + 商品名称 + 商品价格,如:
    1 电脑 1999
    2 鼠标 10
    ...
    2:用户输入选择的商品序号,然后打印商品名称及商品价格
    3:如果用户输入的商品序号有误,则提示输入有误,并重新输入。
    4:用户输入Q或者q,退出程序。
    """

7. 集合(set)

集合与元组和列表相似都用于做容器,在内部可以放一些子元素,但集合有如下殊特点: 子元素不重复无序.

7.1 集合的定义

1
2
3
v1 = {1,2,99,18}
v2 = {"szk","pounds","haoda","xxxx"}
v3 = {1,True,"world",(11,22,33)}

集合与字典虽然都是用{}括号,但字典内部是键值对,而集合内部直接是值。

7.2 常用方法

  1. 添加元素

    1
    2
    3
    data = {"刘嘉玲", '关之琳', "王祖贤"}
    data.add("郑裕玲")
    print(data)
    1
    2
    3
    4
    data = set()
    data.add("周杰伦")
    data.add("林俊杰")
    print(data)
  2. 删除元素

    1
    2
    3
    data = {"刘嘉玲", '关之琳', "王祖贤","张曼⽟", "李若彤"}
    data.discard("关之琳")
    print(data)
  3. 交集

    1
    2
    3
    4
    5
    s1 = {"刘能", "赵四", "⽪⻓⼭"}
    s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
    s3 = s1 & s2 # 方式一:取两个集合的交集
    s4 = s1.intersection(s2)) # 方式二:取两个集合的交集
    print(s3,s4)
  4. 并集

    1
    2
    3
    4
    5
    s1 = {"刘能", "赵四", "⽪⻓⼭"}
    s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
    s3 = s1 | s2 # 方式一:取两个集合的并集
    s4 = s1.union(s2)) # 方式二:取两个集合的并集
    print(s3,s4)
  5. 差集

    1
    2
    3
    4
    5
    6
    7
    8
    9
    s1 = {"刘能", "赵四", "⽪⻓⼭"}
    s2 = {"刘科⻓", "冯乡⻓", "⽪⻓⼭"}
    s3 = s1 - s2 # 方式一:差集,s1中有且s2中没有的值
    s4 = s1.difference(s2) # 方式二:差集,s1中有且s2中没有的值
    print(s3,s4)

    s5 = s2 - s1 # 方式一:差集,s2中有且s1中没有的值
    s6 = s2.difference(s1) # 方式一:差集,s2中有且s1中没有的值
    print(s5,s6)

7.3 转换

其他类型如果想要转换为集合类型,可以通过set进行转换,并且如果数据有重复自动剔除。

提示:int/list/tuple/dict都可以转换为集合。

1
2
3
v1 = [11,22,33,11,3,99,22]
v2 = set(v1)
print(v2) # {11,22,33,3,99}
1
2
3
v1 = "szk"
v2 = set(v1)
print(v2) # {"s","z","k"}
1
2
3
v1 = (11,22,3,11)
v2 = set(v1)
print(v2) # {11,22,3}
1
2
3
4
v1 = {"age":12, "status":True,"name":"szk"}
print( set(v1.keys()) ) # 输出:{'status', 'name', 'age'}
print( set(v1.values()) ) # 输出:{'status', 'name', 'age'}
print( set(v1.items()) ) # 输出:{('age', 12), ('status', True), ('name', 'szk')}

7.4 其他

  1. 索引/切片/步长
    集合中没有提供 索引/切片/步长 这些功能,因为他无需,所以无法使用索引操作。
  2. 获取集合长度
1
2
3
v = {"刘能", "赵四", "尼古拉斯")
data = len(v)
print(data)
  1. for循环
1
2
3
v = {"刘能", "赵四", "尼古拉斯")
for item in v:
print(item)