目录
2.有如下值集合{11,22,33,44,55,66,77,88,99,90}, 将所有大于66的值保存至字典的第一个key的值中,将小于66值保存至第二个key的值中。
一、元组
1.元组简介
- 元组表现形式tuple
- 元组是一个不可变序列(一般当我们希望数据不改变时,我们使用元组,其他情况下基本都用列表)
- 使用()创建元素
my_tuple = (1, 2, 3, 4) print(my_tuple, type(my_tuple))
(1, 2, 3, 4) <class 'tuple'>
2.元组具有和列表一样的操作
-
tuple1 = (1, 1, 2, 3, 4) print(len(tuple1)) print(max(tuple1)) print(min(tuple1)) print(1 in tuple1) print(1 not in tuple1) print(tuple1.count(1)) print(tuple1.index(3))
5 4 1 True False 2 3 Process finished with exit code 0
3.元组拆包
- 元组拆包指将元组当中的每一个元素都赋值给一个变量
my_tuple = (1, 2, 3, 4, 5, 6) a, b, c, d, e ,f= my_tuple # 在对一个元组拆包的时候,变量的数量和元组中元素的数量要把持一致, # a, b, c, d, e=my_tuple 不可以 print('a', a) print('b', b) print('c', c) print('d', d) print('e',e) print('f',f)
a 1 b 2 c 3 d 4 e 5 f 6
my_tuple = (1, 2, 3, 4, 5, 6) a, *b, c, d = my_tuple #这里的*b代表剩余的元素 # *只可有一个 # a, *b, *c, d = my_tuple 不可以 print('a', a) print('b', b) print('c', c) print('d', d)
a 1 b [2, 3, 4] c 5 d 6
- 字符串和列表的拆包也一样
# 字符串拆包 s = 'abcdef' a, b, *c = s print(a, b, c) # 列表拆包 list1 = [1, 2, 3, 4] a, b, *c = list1 print(a, b, c)
a b ['c', 'd', 'e', 'f'] 1 2 [3, 4]
二、字典
1.字典的基本介绍
- 字典属于一种新的数据结构称为映射(mapping)
- 字典的作用和列表类似,都是用来存储对象的容器
- 列表存储数据的性能好,但是查询数据的性能差,字典正好与之相反
- 在字典中每一个元素都有唯一的名字,通过这个唯一的名字可以找到指定的元素
- 这个唯一的名字我们称之为key 通过key可以快速查询value 也可以称之为值
- 字典我们也称之为键值对(key-value)结构
- 每个字典中都可以有多个键值对,而每一个键值对我们称其为一项(item)
- 创建一个有数据的字典 语法 {key:value}
d = {'name':'刘亦菲','age':18,'gender':'女神'} print(d, type(d))
{'name': '刘亦菲', 'age': 18, 'gender': '女神'} <class 'dict'>
- 字典的值可以是任意对象 字典的键可以是任意的不可变对象(int str bool tuple....)
- 字典的键是不能重复的,如果出现重复的后面的会替换前面的
d = { 'name': '刘亦菲','age': 18,'gender': '女神','name': '周慧敏'} print(d)
{'name': '周慧敏', 'age': 18, 'gender': '女神'}
2.字典的使用
- dict()函数来创建字典
d1 = dict(name='刘亦菲', age=18) print(d1)
{'name': '刘亦菲', 'age': 18}
# 双值子序列 [(1, 2), (3, 4)] list1 = [(1, 2), (3, 4)] d = dict(list1) print(d)
{1: 2, 3: 4}
- get(key,default) 根据键来获取字典的值。第二个参数可以指定一个默认值,当获取不到值的时候会返回默认值
# get(key, default) # 如果是没有这个key,返回None,不会报错 # 也可以指定一个默认值,来作为第二个参数,这样获取不到key值的是偶可以返回默认值 d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } print(d.get('xec')) print(d.get('xec','你是谁')) print(d.get('name'))
None 你是谁 刘亦菲
# 修改字典 d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } # d[key] = value d['age'] = 16 print(d) # 没有这个key-value就是添加 d['height'] = 174 print(d)
{'name': '刘亦菲', 'age': 16, 'gender': '女神'} {'name': '刘亦菲', 'age': 16, 'gender': '女神', 'height': 174}
- setdefault(key,default)添加,如果这个key已经存在于字典中,则返回value值,不会对字典造成影响,如果存在,则向字典中添加key-value
# 添加 setdefault(key, default) # 如果这个key已经存在于字典中,则返回value值,不会对字典造成影响 # 如果不存在,则向字典中添加key-value d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } res = d.setdefault('name', '周慧敏') print(res) res = d.setdefault('height', 170) print(res) print(d)
刘亦菲 170 {'name': '刘亦菲', 'age': 18, 'gender': '女神', 'height': 170}
- update() 将其他字典的key-value添加到当前的字典当中
# 添加 update() 将其他的字典当中的key-value添加到当前的字典中 d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } d1 = {1: '1', 2: '2'} d.update(d1) print(d)
{'name': '刘亦菲', 'age': 18, 'gender': '女神', 1: '1', 2: '2'}
- del 删除字典中的key-value
# del 删除字典中的key-value d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } del d['age'] print(d)
{'name': '刘亦菲', 'gender': '女神'}
- popitem() 删除字典最后的一个key-value 这个方法是有返回值的。删除之后它会将删除的key-value作为返回值返回
# popitem() 随机删除一个键值对,一般都是删除最后一个 # 它会将删除后的键值对作为返回值返回 d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } res = d.popitem() print(res) print(d)
('gender', '女神') {'name': '刘亦菲', 'age': 18}
- pop(key,default) 根据key删除自定中的value。第二个参数可以指定一个默认值,当获取不到值的时候会返回默认值
# pop(key, default) # 如果key不存在,则返回default # 如果key存在,可省略default, 而如果key不存在,不可省略defaul,否则会报错 d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } res = d.pop('height','不存在') print(res) print(d) res = d.pop('age') print(res) print(d)
不存在 {'name': '刘亦菲', 'age': 18, 'gender': '女神'} 18 {'name': '刘亦菲', 'gender': '女神'}
- clear()清空字典
#clear() 清空字典 d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } d.clear() print(d)
{}
- copy() 方法用来对字典进行潜复制
- 注意:潜复制只会复制字典本身,如果字典中还有别的数据类型是不会进行复制的
-
d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神', 'friend': { 'name': '唐嫣', 'age': 32 } } d1 = d.copy() print(d1) # 浅拷贝: 第二层数据的id一样, 拷贝之后的对象和原对象id不一样 (第二层的数据只能引用) print(id(d['friend']), id(d1['friend'])) print(id(d), id(d1))
{'name': '刘亦菲', 'age': 18, 'gender': '女神', 'friend': {'name': '唐嫣', 'age': 32}} 1688651000928 1688651000928 1688651001000 1688651001360
# 深拷贝 把所有层次的数据重新拷贝成为一个新的对象 import copy d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神', 'friend': { 'name': '唐嫣', 'age': 32 } } d2 = copy.deepcopy(d) print(id(d['friend']), id(d2['friend'])) print(id(d), id(d2))
1895790439520 1895791755768 1895790439592 1895790527112
2.1另外
d = {
'name': '刘亦菲',
'age': 18,
'gender': '女神'
}
# len() 是对key进行操作
print(len(d))
# in not in 是对key进行操作
print('name' in d)
print('刘亦菲' in d)
print(d['age']) #查找
# 字典中没有索引,没有index()和count()方法
3
True
False
18
3.遍历字典
我们主要可以通过3种方式对字典进行遍历
- keys() 该方法返回字典所有的key
- values() 该方法返回一个序列 序列中保存有字典的值
- items() 该方法会返回字典中所有的项 它返回一个序列,序列中包含有双值子序列 双值分别是 字典中的key和value
d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } print('keys():',d.keys()) print('values():',d.values()) print('items():',d.items())
keys(): dict_keys(['name', 'age', 'gender']) values(): dict_values(['刘亦菲', 18, '女神']) items(): dict_items([('name', '刘亦菲'), ('age', 18), ('gender', '女神')])
d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } for k in d.keys(): print(d[k]) # 是不是和我一样异想天开,来了个如下 # for k in d.values(): # print(d[k]) # 不好意思,这个报错了
刘亦菲 18 女神
d = { 'name': '刘亦菲', 'age': 18, 'gender': '女神' } for k, v in d.items(): print(k, '=', v)
name = 刘亦菲 age = 18 gender = 女神
三、集合
1.集合简介
- 集合表现形式set 集合和列表非常相似
- 不同点
- 集合只能存储不可变对象
# 集合只能存储不可变对象 s={[1, 2, 3]} print(s) # 报错如下 [1, 2, 3]是列表,是个可变对象
Traceback (most recent call last): File "D:/桌面/Python课程/Python核心编程-cheney/20201127-第七讲-元组&字典&集合/上课代码/集合的简介.py", line 13, in <module> s={[1, 2, 3]} TypeError: unhashable type: 'list'
- 集合中存储的对象是无序的
# 集合中存储的对象是无序的 s = {1, 2, 'sdfb', 3, (1, 2)} print(s)
{(1, 2), 1, 2, 3, 'sdfb'}
- 集合不能出现重复元素
# 集合不能出现重复元素 # 用集合去做去重的操作 s = {1, 2, 'sdfb', 3, (1, 2), 1, 2, 3} print(s)
{(1, 2), 1, 2, 3, 'sdfb'}
- 集合只能存储不可变对象
- 使用{}来创建集合
- 可以通过set()来将序列和字典转换成集合
# 去重 list1 = [1, 2, 3, 4, 4, 3, 2, 1] print(set(list1)) print(list(set(list1)))
{1, 2, 3, 4} [1, 2, 3, 4]
- len() 使用len()来获取集合中元素的数量
s={1, 2, 3} print(len(s))
3
- add()像集合中添加元素
# add() 添加元素进集合 s = set() #空集合 s.add(1) print(s)
{1}
- update()将一个集合中的元素添加到另一个集合当中
# update() 将一个集合中的元素添加到另一个集合中 s=set() #空集合 s1 = {2, 3, 4, (1, 2)} s.update(s1) print(s)
{(1, 2), 2, 3, 4}
- pop()随机删除集合中的一个元素一般是删除最后一个元素
# pop() 随机删除 s = {2, 3, 4, (1, 2),5} s.pop() print(s)
{2, 3, 4, 5}
- remove() 删除集合中指定的元素
# remove() 指定删除元素 s = {2, 3, 4, (1, 2),5} s.remove((1, 2)) print(s)
{2, 3, 4, 5}
- clear() 清空集合
# clear() 清空 s = {2, 3, 4, (1, 2),5} s.clear() print(s)
set()
2.集合的运算
- & 交集运算
- | 并集运算
- - 差集运算
- ^ 亦或集
s1 = {2, 3, 4, (1, 2),5} s2 = {1, 2, 3, (1, 2), (2, 3)} # & 交集运算 | 并集运算 和数学中集合的交集并集运算一样 print(s1 & s2) print(s1 | s2) # - 差集运算 将s1中和s2相同元素移除 print(s1 - s2) # ^ 亦或运算 将s1和s2不相同的元素组成一个新集合 print(s1 ^ s2)
{(1, 2), 2, 3} {(1, 2), 1, 2, 3, 4, 5, (2, 3)} {4, 5} {1, (2, 3), 4, 5}
- <= 检查一个集合是否是另一个集合的子集
- < 检查一个集合是否是另一个集合的真子集
- >=检查一个集合是否是另一个集合的超集
- >检查一个集合是否是另一个集合的真超集
s1 = {2, 3, 4, (1, 2), 5} s2 = {2, 3} s3 = {2, 3, 4, (1, 2), 5} print(s2 <= s1) print(s2 < s1) print(s3 <= s1) print(s3 < s1) print(s1 >= s2) print(s1 > s2) print(s1 >= s3) print(s1 > s3) # 会数学中集合的子集和真子集,这个就能够轻易掌握
True True True False True True True False
三、小练习
1.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"}]}}
# 方法一:
b=a.get("data").get("result")
for i in b:
print(i.get("src"))
# 方法二:
for i in a['data']['result']:
print(i['src'])
2.有如下值集合{11,22,33,44,55,66,77,88,99,90}, 将所有大于66的值保存至字典的第一个key的值中,将小于66值保存至第二个key的值中。
s={11,22,33,44,55,66,77,88,99,90}
d={'大于66':[],'小于66':[]}
for i in s:
if i > 66:
d.setdefault('大于66').append(i)
if i < 66:
d.setdefault('小于66').append(i)
print(d)