Grundlagen-7, Tupel, Wörterbücher und Sets
一、元组
- 元组表现形式是tuple,用()表示
- 例如:tuple1 = (1,2,3,4)
- 元组是一个不可变序列(一般我们希望数据不改变时,我们使用元组,其他情况下基本使用列表)
- 索引[ ]在元组中同样适用
- 元组如果不是空元组至少有一个逗号(,)当元组不是空元组时括号可以省略
tuple2 = (10,)
tuple2 = 10,
print(type(tuple2))
- 元组解包:是指将元组当中的每一个元素都赋值给一个变量
例如:
tuple1 = (1,2,3,4)
a,b,c,d = tuple1
print(a,b,c,d)
a,b,*c = tuple1
print(a,b,c)# 匹配出列表[]
结果:
1 2 3 4
1 2 [3, 4]
- 字符串的解包:将字符串的每个元素赋值给一个变量
例如:
s = 'abcdef'
a,b,*c = s
print(a,b,c)
结果:
a b ['c', 'd', 'e', 'f']
- 列表的拆包:将列表的每个元素赋值给一个变量
例如:
list1 = [1,2,3,4]
a,b,*c = list1
print(a,b,c)
结果:
1 2 [3, 4]
二、字典
- 字典的表示方法:用{ }表示,里面的数据元素的表现形式是key-value形式,即–名称:数据,key:valie
- 字典的定义:字典和列表类似,也是可变序列,只是与列表不同,它是无序的可变序列,保存的内容是以“键——值对”的形式存放,这类似于我们使用查找汉字的新华字典,它可以把拼音和汉字串起来,通过拼音音节表来快速查找到想要找的汉字。其中新华字典里面的音节表相当于键(key)对应的汉字相当于值(value)。键是惟一的,而值可以是多个。
- 例如
创建一个空的字典:dict1 = { } - 字典的主要特征:
-
1.通过键(key)而不是通过索引来读取
字典也称为关联数组或者散列表(hash),提示通过键(key)将一系列的值(value)联系起来,所以想要读取字典必须通过键(key)来读取,而不能通过索引来读取
注:因为字典是无序的可变序列,所以所以索引的下标并不存在,索引无效。 -
2.字典是任意对象的无序组合
字典是无序的,各项是从左到右随机排序的,及保存在字典当中的项没有特定的顺序,这样可以提高查找速度。 -
3.字典是可变的,并且是可以任意嵌套
字典可以在任意处正常或缩短(无需生成一份副本)并且他支持任意深度的嵌套(字典的值可以使列表或者其他子字典)(字典的深拷贝与浅拷贝) -
4.字典中的键必须是唯一
不允许同一个键出现两次,如果出现两次,则后一个值会被记住,第一个会被忘记。(当字典中的key有重复的,后面的回替换前面的。) -
5.字典中的键必须不可变
字典中的键是不可改变的,所以可以使用数字、字符串或者元组,但不能使用列表。
注:当字典中的键(key)重复的时候,后面的会覆盖前面的。
-
三、字典的使用
- 双值子序列
例如:
['ab','cd']
- 双值序列:序列中有两个值
例如:
[1,2],'ab',(a,b)
- 子序列:序列中的元素也是序列
例如:
['a']
- 创建字典:通过双值子序列创建
例如;
dict3 = dict(([('name','郭靖'),('age',30 ),('gender','男')]))
四、字典的增删改查
4.1 len()函数
- len()函数:获取字典中键值对的个数
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
print(len(dict1))
4.2in not in 语句
- in not in----检验字典中是否(不)包含指定的键
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
print('name' in dict1) # not in 同理
4.3 通过键(key)来获取字典中的值(value)(查找方式)
- 语法:dict[key]
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
print(dict1['name1'])
4.4 get()函数(查找方式)
- get(key, default)----通过key来获取value 其中default是一个默认值(返回值)
- 语法:字典.get(‘key’,‘value’)—value可有可无
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
print(dict1.get('ag1','没有找到'))
print(dict1.get('age'))
4.5 修改字典: 通过key来修改value
- 语法:dict[key] = value
- 特性:如果key值不存在,则向字典中添加一个key:value
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
dict1['gongfu'] = '五毒拍砖掌' # 特性实例展示
dict1['name'] = '黄老邪' # 修改字典实例展示
print(dict1)
4.6 setdefault(key, default)(添加方法)
- setdefault(key, default):向字典中添加key:value
- 字典名.setdefault(‘key’,‘value’)
- 特性:
1.如果这个key已经存在与字典中,则返回value值,不会对字典有任何影响。
2.如果key不存在,则向字典中添加key:value。 - 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
result = dict1.setdefault('name','黄老邪')# 特性1展示实例
# result1 = dict1.setdefault('name3','郭襄')# 特性2展示实例
print(result,dict1)
# print(result1,dict1)
4.7 update()(添加方法)
- update()将其他字典中的key-value添加到当前字典中
- 语法:字典2.update(字典1) ----将字典1添加进字典2
- 例如;
d1 = {
1 : '1',
2 : '2'
}
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
dict1.update(d1)
print(dict1)
4.8 del(删除方法)
- del 删除字典中的ley-value
- 语法:字典 = 字典名.popitem()—打印输出字典
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
del dict1['name1']
print(dict1)
4.9 popitem()(删除方法)
- popitem()随机删除一个键值对,一般默认删除最后一个
- 语法:字典 = 字典.popitem()—打印输出字典
- 特性:它会将删除之后的键值对作为返回值返回,返回的是一个元组,第一个元素是key,第二个元素是value
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
result = dict1.popitem()
# print(result) # 特性展示实例
print(dict1)
结果:
('name1', '黄蓉')
{'name': '郭靖', 'age': 30, 'gender': '男'
4.9.1 pop()(删除方法)
- pop(key,defualt)根据key来删除key-value
- 语法:字典1 = 字典.pop(key)----打印输出print(字典1,字典)
- 特性:删除key-value并返回value
- 例如:
# dict1 = {'name':'郭靖',
# 'age': 30 ,
# 'gender':'男',
# 'name1':'黄蓉'
# }
# result = dict1.pop('name1')
# print(result,dict1)
结果:
黄蓉 {'name': '郭靖', 'age': 30, 'gender': '男'}
4.9.2 clear()(删除方法)
- clear() 清空字典
- 语法:字典.clear()
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
dict1.clear()
print(dict1)
结果:
{}
五、字典的深浅拷贝
- 深拷贝与浅拷贝的定义:
- 深拷贝:假设B复制了A,当修改A的某一项数据,而B的数据未改变,则称之为深拷贝
- 浅拷贝:假设B复制了A,当修改A的某一项数据,而B的数据发生改变,则称之为浅拷贝
1.字典的浅拷贝:
- 语法:
- 字典名(B) = 字典名(A).copy()
- 字典名(A)[key] = value # 修改字典
- 例如:
浅拷贝
dict1 = {'name':'刘亦菲',
'age': 18 ,
'gender':'女',
'a': {'name' : '周慧敏',
'age' : '21',
}
}
dict2 = dict1.copy()
print(id(dict1),id(dict2))
print(id(dict1['a']), id(dict2['a']))
结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-07/上课代码/字典的深拷贝与浅拷贝.py
140677664519488 140677664519808
140677664519424 140677664519424
Process finished with exit code 0
2. 字典的深拷贝:
注:把所有层次的数据重新拷贝成为一个新的对象
- 语法:
导包—import copy
字典名(B) = copy.deepcopy(字典名(A))
字典名(A)[key] = value # 修改字典- 例如:
import copy
dict1 = {'name': '刘亦菲',
'age': 18,
'gender': '女',
'a': {'name': '周慧敏',
'age': '21',
}
}
dict2 = copy.deepcopy(dict1)
print(id(dict1), id(dict2))
print(id(dict1['a']), id(dict2['a']))
结果:
/Volumes/苹果微软公共盘/PycharmProjects/venv/bin/python /Volumes/苹果微软公共盘/PycharmProjects/基础班第11期/day-07/上课代码/字典的深拷贝与浅拷贝.py
140441184396096 140441197411008
140441184396032 140441197509760
Process finished with exit code 0
总结:当改变字典dict1时,dict2未发生变化
拓展:
id()函数: 可以返回对象的内存位置
六、字典的遍历
1 . 通过value,进行遍历
- 语法:dict.value()
- 特性:通过dict.value() 遍历字典,返回的是一个序列,保存的是字典中所有的值(value)。
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
print(dict1.values())
2 .通过key,进行遍历
- 语法:dict.keys()
- 通过dict.keys() 遍历字典,返回的是一个序列,保存的是字典中所有的键(key)。
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
'gender':'男',
'name1':'黄蓉'
}
print(dict1.keys())
for k in dict1.keys():
print(dict1[k])
3.dict.items()
- 返回字典中所有的项,返回的是一个序列,这个序列中包含双值子序列,双值就是字典中的key-value
- 语法:for key,value in dict1.items():。
- 输出: print(key, ‘=’, value)
- 例如:
dict1 = {'name':'郭靖',
'age': 30 ,
# 'gender':'男',
'name1':'黄蓉'
}
print(dict1.items())
for k,v in dict1.items():
print(k, '=' , v)
结果:
dict_items([('name', '郭靖'), ('age', 30), ('name1', '黄蓉')])
name = 郭靖
age = 30
name1 = 黄蓉
七、集合
集合的表示方法:set{}
1 .集合只能存在不可变的对象
- set1 = {(1,2),‘ab’,True,None}
print(set1)
2 .集合中存储的对象是无序的,没有索引
- set1 = {5,10,7}
print(set1)
3 .集合不能出现重复的元素----去重set()
- set1 = {1,(1,2),‘ab’,True,None}
print(set1)
4 .创建集合
- set1 = {}
set1 = set()
print(set1,type(set1))
5 . 去重操作
- list1 = [1,2,3,4,5,1,2,3,6,7]
n = set(list1)
print(n)
6 .将字典转换为集合的时候,只会包含字典当中的key
- dict1 = {1: ‘1’,2: ‘2’}
n = set(dict1)
print(n)
八、集合的运用
8.1 in not in语句
- in not in----检验集合中是否(不)包含指定的元素
- 例如;
set1 = {(1,2),'ab',True,None}
print('ab' in set1)
8.2len()函数
- len()–得出集合内元素的个数
- 例如:
set1 = {(1,2),'ab',True,None}
print(len(set1))
8.3 set.add()
- set.add()向集合中添加元素
- 例如:
set1 = set()
set1.add(1)
print(set1)
8.4 set.update()
- set.update() ----将一个集合中的元素添加到另一个集合中
- 例如:
s1 = set('hello')
s2 = set('python')
s1.update(s2)
print(s1)
8.5 set.pop()
- set.pop()—随机删除集合中的一个项
- 例如:
set1 = {'a','b',1,2}
r = set1.pop()
print(set1)
print(r)
8.6 set.remove()
- set.remove()—删除集合中指定的项
- 例如:
set1 = {'a','b',1,2}
set1.remove('a')
print(set1)
结果:
{1, 2, 'b'}
8.7 set.clear()
- set.clear()—清空集合中的项
- 例如:
set1 = {'a','b',1,2}
set1.clear()
print(set1)
结果:
set()
扩展:可变类型与不可变类型
1、不可变类型:Number(数字)、String(字符串)、Tuple(元组)。
2、可变类型:可以变:Set(集合)、List(列表)、Dictionary(字典)。
作业习题
作业1:
'''
a = {"name":"123","data":{"result":[{"src":"python1"},{"src":"python2"},{"src":"python3"}]}} 找到python1/python2/python3
'''
分析+代码:
# 1.首先确定我们需要找到值(value)
# value在第三个元素的value中
# 2.通过get()函数取出第二元素的值(value)
b = a.get("data")
# print(b) #检验是否将第二项元素value元素取出并创建新的字典B
# 3.通过get()函数取出第三元素的值(value)
c = b.get("result")
# print(c)# 检验是否创建了新的列表C
# c = [{'src': 'python1'}, {'src': 'python2'}, {'src': 'python3'}]
# 4.将列表c的元素取出生成新的字典d1 d2 d3
d1 = c[0]
d2 = c[1]
d3 = c[2]
#d3 = c.pop(2)
# print(d1,d2,d3)
# 5.打印出value
print(d1['src'])
print(d2['src'])
print(d3['src'])
结果:
python1
python2
python3
作业2:
'''
有如下值集合[11,22,33,44,55,66,77,88,99,90], 将所有大于66的值保存至字典的第一个key的值中,将小于66值保存至第二个key的值中。
'''
分析+代码:
list0 = [11,22,33,44,55,66,77,88,99,90]
# 分析:
# 1.建立两个空的列表
list1 = [] # 大于66,key1
list2 = [] # 小于66,key2
# 2.建立一个空的字典
dict1 = {}
# 3.通过 for in 遍历list0,通过条件判断语句判断
for i in list0:
if i < 66 :
list2.append(i) # list.append()向列表最后添加一个元素
elif i == 66:
continue
else:
list1.append(i)
# setdefault(key, default):向字典中添加key:value
dict1.setdefault('key2',list2)
dict1.setdefault('key1',list1)
print(dict1)
结果:
{'key1': [77, 88, 99, 90], 'key2': [11, 22, 33, 44, 55]}