1、元组
1.1 元组简介
- 元组表现形式tuple
- 元组是⼀个不可变序列(⼀般当我们希望数据不改变时,我们使⽤元组,其他情况下基本都⽤列表)
- 使⽤()创建元素
- 元组不是空元组⾄少有⼀个 逗号(,) 当元组不是空元组时括号可以省略
- 元组解包指将元组当中的每⼀个元素都赋值给⼀个变量
# 元组的拆包
tuple1 = (1, 2, 3, 4)
a, b, *c = tuple1 # *是一个通配符
print(a)
print(b)
print(c)
结果如下:
2、字典
2.1 字典简介
- 字典属于⼀种新的数据结构称为映射(mapping)
- 字典的作⽤和列表类似,都是⽤来存储对象的容器
- 列表存储数据的性能好,但是查询数据的性能差,字典正好与之相反
- 在字典中每⼀个元素都有唯⼀的名字,通过这个唯⼀的名字可以找到指定的元素
- 这个唯⼀的名字我们称之为key 通过key可以快速查询value 也可以称之为值
- 字典我们也称之为键值对(key-value)结构
- 每个字典中都可以有多个键值对,⽽每⼀个键值对我们称其为⼀项(item)
- 创建⼀个有数据的字典 语法 {key:value}
- 字典的值可以是任意对象 字典的键可以是任意的不可变对象(int str booltuple…)
- 字典的键是不能重复的,如果出现重复的后⾯的会替换前⾯的
2.2字典的使用
- dict()函数来创建字典
# 字典的创建 dict {}
dict1 = {} # 创建空字典
print(type(dict1))
dict2 = {'name': '杨过', 'age': '18', 'gender': '男'}
print(dict2)
结果如下:
- get(key[,default]) 根据键来获取字典的值。第⼆个参数可以指定⼀个默认值,当获取不到值的时候会返回默认值
dict1 = {
'name': '杨过',
'age': '18',
'gender': '男',
'skill': '黯然消魂掌'
}
print(dict1.get('skill'))
print(dict1.get('sex', '不存在'))
结果如下:
- update() 将其他字典的key-value添加到当前的字典当中
dict1 = {
'name': '杨过',
'age': '18',
'gender': '男',
'skill': '黯然消魂掌'
}
dict1.update({'1': 1, "2": 2, '3': 3})
print(dict1)
结果如下:
- del 删除字典中的key-value
dict1 = {
'name': '杨过',
'age': '18',
'gender': '男',
'skill': '黯然消魂掌'
}
del dict1['name']
print(dict1)
结果如下:
- popitem() 删除字典最后的⼀个key-value 这个⽅法是有返回值的。删除之后它会将删除的key-value作为返回值返回
dict1 = {
'name': '杨过',
'age': '18',
'gender': '男',
'skill': '黯然消魂掌'
}
a = dict1.popitem()
print(a)
print(dict1)
结果如下:
- pop(key[,default]) 根据key删除⾃定中的value。第⼆个参数可以指定⼀个默认值,当获取不到值的时候会返回默认值
dict1 = {
'name': '杨过',
'age': '18',
'gender': '男',
'skill': '黯然消魂掌'
}
a = dict1.pop('age')
b = dict1.pop('123', '不存在')
print(a, b)
print(dict1)
结果如下:
- copy() ⽅法⽤来对字典进⾏潜复制(注意:潜复制只会复制字典本身,如果字典中还有个字典是不会进⾏复制的)
import copy
# 浅拷贝: 只能拷贝第一层的数据,不能拷贝第二层乃至更多蹭数据;外层添加元素时,浅拷贝不会随原列表变化而变化;内层添加元素时,浅拷贝才会变化。
dict1 = {'name': 123, 'data': [1, 2, 3]}
dict2 = copy.copy(dict1)
dict1['name'] = 456
dict1['data'][1] = 456
print(dict1, dict2)
print(id(dict1), id(dict2))
结果如下:
深拷贝:deepcopy()
import copy
# 深拷贝: 能够将所有层次的数据拷贝出来,重新独立一份;无论原列表如何变化,深拷贝都保持不变。
dict1 = {'name': 123, 'data': [1, 2, 3]}
dict2 = copy.deepcopy(dict1)
dict1['data'][1] = 456
print(dict1, dict2)
print(id(dict1['data']), id(dict2['data']))
print(id(dict1), id(dict2))
结果如下:
2.3 遍历字典
- keys() 该⽅法返回字典所有的key
dict1 = {
'name': '杨过',
'age': '18',
'gender': '男',
'skill': '黯然消魂掌'
}
# keys()
for k in dict1.keys():
print(k, dict1[k])
结果如下:
- values() 该⽅法返回⼀个序列 序列中保存有字典的值
dict1 = {
'name': '杨过',
'age': '18',
'gender': '男',
'skill': '黯然消魂掌'
}
# values()
for v in dict1.values():
print(v)
结果如下:
- items() 该⽅法会返回字典中所有的项 它返回⼀个序列,序列中包含有双值⼦序列 双值分别是 字典中的key和value
dict1 = {
'name': '杨过',
'age': '18',
'gender': '男',
'skill': '黯然消魂掌'
}
# items()
for k, v in dict1.items():
print(k, v)
结果如下:
3、集合
3.1 集合的简介
- 集合表现形式set 集合和列表⾮常相似
- 不同点
– 集合只能存储不可变对象
# 集合只能存储不可变对象
set1 = {1, 2, 3, 4, 5}
print(set1)
– 集合中存储的对象是⽆序的
# 集合中存储的对象是无序的,他是没有索引的
set2 = {6, 8}
print(set2)
结果如下:
– 集合不能出现重复元素
# 集合不能出现重复元素,根据这个特性,可以用集合去重
set3 = {1, 1, 2, 2, 3, 4}
print(set3)
结果如下:
3.2 集合的使用
- 使⽤{}来创建集合
# 创建空集合
set1 = set()
print(type(set1))
- 可以通过set()来将序列和字典转换成集合
list1 = [1, 1, 2, 2, 3, 4]
set4 = set(list1)
print(set4)
list1 = list(set4)
print(list1)
- len() 使⽤len()来获取集合中元素的数量
a = {1, 2, 3, 4}
print(len(a))
结果如下:
- add()像集合中添加元素
a = {1, 2, 3, 4}
a.add(5)
print(a)
结果如下:
- update()将⼀个集合中的元素添加到另⼀个集合当中
a = {1, 2, 3, 4}
a.update({5, 6, 7})
print(a)
结果如下:
- pop()随机删除集合中的⼀个元素⼀般是删除最后⼀个元素
a = {1, 2, 3, 4}
a.pop()
print(a)
结果如下:
- remove() 删除集合中指定的元素
a = {1, 2, 3, 4}
a.remove(3)
print(a)
结果如下:
- clear() 清空集合
a = {1, 2, 3, 4}
a.clear()
print(a)
结果如下:
3.3 集合的运算
- & 交集运算
s1 = {1, 2, 3}
s2 = {3, 4, 5}
# & 交集运算
print(s1 & s2)
结果如下:
- | 并集运算
s1 = {1, 2, 3}
s2 = {3, 4, 5}
# # | 并集运算
print(s1 | s2)
结果如下:
- – 差集运算
s1 = {1, 2, 3}
s2 = {3, 4, 5}
# # - 差集运算
print(s1 - s2)
print(s2 - s1)
结果如下:
- ^ 亦或集
s1 = {1, 2, 3}
s2 = {3, 4, 5}
# # ^亦或集
print(s1 ^ s2)
结果如下:
- <= 检查⼀个集合是否是另⼀个集合的⼦集
s1 = {1, 2, 3}
s2 = {3, 4, 5}
s3 = {1, 2, 3, 4, 5, 6}
# <= 检查⼀个集合是否是另⼀个集合的⼦集
print(s1 <= s2)
print(s1 <= s3)
结果如下:
- < 检查⼀个集合是否是另⼀个集合的真⼦集
s1 = {1, 2, 3}
s2 = {3, 4, 5}
s3 = {1, 2, 3, 4, 5, 6}
# < 检查⼀个集合是否是另⼀个集合的真⼦集
print(s1 < s2)
print(s1 < s3)
结果如下:
- ">="检查⼀个集合是否是另⼀个集合的超集
s1 = {1, 2, 3}
s2 = {3, 4, 5}
s3 = {1, 2, 3, 4, 5, 6}
# >=检查⼀个集合是否是另⼀个集合的超集;如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S1就是S2的一个超集,反过来,S2是S1的子集。 S1是S2的超集,若S1中一定有S2中没有的元素,则S1是S2的真超集,反过来S2是S1的真子集。
print(s1 >= s2)
print(s3 >= s1)
结果如下:
- ">"检查⼀个集合是否是另⼀个集合的真超集
s1 = {1, 2, 3}
s2 = {3, 4, 5}
s3 = {1, 2, 3, 4, 5, 6}
# >检查⼀个集合是否是另⼀个集合的真超集
print(s1 >= s2)
print(s3 >= s1)
结果如下:
课后作业
作业一:a = {"name":"123","data":{"result":[{"src":"python1"},{"src":"python2"},{"src":"python3"}]}} 找到python1/python2/python3
a = {"name": "123", "data": {"result": [{"src": "python1"}, {"src": "python2"}, {"src": "python3"}]}}
for i in range(0, 3):
python = a.get('data').get('result')[i].get('src')
print(python)
结果如下:
作业二:有如下值列表[11,22,33,44,55,66,77,88,99,100], 将所有⼤于66的值保存⾄字典的第⼀个key的值中,将⼩于66值保存⾄第⼆个key的值中。
list1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 100]
dict1 = {'key1': [], 'key2': []}
for i in list1:
if i > 66:
dict1['key1'].append(i)
elif i < 66:
dict1['key2'].append(i)
print(dict1)
结果如下: