Python集合 (set) 的增删改查及 copy()方法
Posted python学习者0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python集合 (set) 的增删改查及 copy()方法相关的知识,希望对你有一定的参考价值。
集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。
以下是集合最重要的两点:
1、去重,把一个列表变成集合,就自动去重了。
2、关系测试,测试两组数据之前的交集、差集、并集等关系。
一、集合的创建
set1 = set(1,2,3,4,5)
set2 = 1,2,3,4,5
set3 = set(\'abc\')
print(set1,set2,set3) #1, 2, 3, 4, 5 1, 2, 3, 4, 5 \'c\', \'b\', \'a\'
二、添加集合元素的方法
add( )方法:
此方法是用来往集合里添加单个元素,如果已存在,则不会添加。
set1 = 1,2,3,4,5
set1.add(6)
print(set1)
set1.add(1)
print(set1)
update( )方法:
此方法是用来迭代的往集合里添加元素
set1 = 1,2,3,4,5
set1.update(\'6\') #不能直接添加数字类型,因为数字类型不可迭代
print(set1) # 1, 2, 3, 4, 5, \'6\'
set1.update(\'abc\')
print(set1) #1, 2, 3, 4, 5, \'c\', \'a\', \'6\', \'b\'
set1.update([1,7,8,9])
print(set1) #1, 2, 3, 4, 5, \'b\', 7, 8, 9, \'a\', \'c\', \'6\'
三、删除集合元素的方法
set1 = 1,2,3,4,5
set1.pop() #随机删除一个元素,将元素值返回
set1.remove(\'2\') #指定删除一个元素,找不到就会报错
set1.clear() #清空整个集合
del set1 #删除整个集合
四、查询集合元素的方法
由于集合是无序的又没有索引,所以查询集合元素只有一种,那就是循环,如下:
set1 = 1,2,3,4,5
for s in set1:
print(s)
#结果如下:
# 1
# 2
# 3
# 4
# 5
五、集合的交集、并集等
set1 = 1,2,3,7,8
set2 = 2,3,6,9
print(set1&set2) #交集2, 3
print(set1|set2) #并集1, 2, 3, 6, 7, 8, 9
print(set1^set2) #反交集1, 6, 7, 8, 9
print(set1-set2) #差集8, 1, 7 独有的
print(set2-set1) #差集9, 6 独有的
set1 = 1,2,3 #set1为set2的子集
set2 = 1,2,3,4,5 #set2为set1的超集13 print(set1 < set2) #判断一个集合是否为另一个集合的子集,用\' < \'判断 如果是,返回:True
六、frozenset( )不可变集合(无法添加无法修改)
set1 = 1,2,3,4,5
set2 = frozenset(set1)
print(set2,type(set2))
#结果为:frozenset(1, 2, 3, 4, 5) <class \'frozenset\'>
#创建方法如下:
set3 = frozenset(1,2,3)
print(set3) # frozenset(1, 2, 3)
set4 = frozenset(\'abc\') #迭代添加
print(set4) # frozenset(\'a\', \'b\', \'c\')
七、copy( )与 deepcopy()
这两种方法用于复制一个变量然后赋值给另一个变量。
copy( )----浅复制
简单来讲,用此方法复制后的变量与原变量对应的内存地址是不一样的,修改它第一层的元素,另一个变量不会被修改
但是如果他们有嵌套(如列表里嵌套列表),那么第二层嵌套的列表与另一个变量所对应的列表的地址就是一个内存地址了,
这个时候,如果修改第二层的元素,则另一个变量也会被修改
用法:
a = [\'a\',\'b\',\'c\']
b = a.copy()
print(b)
#结果为:[\'a\', \'b\', \'c\']
复制之后两个变量所对应的内存地址的问题:
先看赋值运算:
此时两个内存地址是一样的,更改一个列表的值,另一个也会被修改,如下:
li1 = [1,2,[3,4],5]
li2 = li1
print(li1 is li2) # True
li2[0] = 0 #更改li2的值,li1也会被修改
print(li1) #结果:[0, 2, [3, 4], 5]
再看看copy方法:
此时他们的内存地是不同的,更改一个列表的第一层元素的值,另一个不会被更改,如下:
li1 = [1,2,[3,4],5]
li2 = li1.copy()
print(li1 is li2) #False
li2[0] = 0 #更改li2第一层的值,li1不会被修改
print(li1) #[1, 2, [3, 4], 5]
但是,如果我们要修改一个列表的第二层元素的话,另一个列表就会被修改了,如下:
li1 = [1,2,[3,4],5]
li2 = li1.copy()
print(li1 is li2) #False
li2[2][0] = 0 #更改li2第二层的值,li1就会被修改
print(li1) #[1, 2, [0, 4], 5]
deepcopy( )----深复制
简单来讲,用此方法复制后的变量与原变量对应的内存地址是不一样的,不管有没有嵌套,修改它第一层的元素,另一个变量不会被修改
但是用这个方法之前,必须得导入copy包,如下:
import copy
li1 = [1,2,[3,4],5]
li2 = copy.deepcopy(li1)
print(li1 is li2) #False
#Python小白学习交流群:711312441
li2[2][0] = 0 #更改li2第二层的值,li1也不会被修改
print(li1) #[1, 2, [3, 4], 5]
八、如何将一个列表里的重复元素去掉
思路:将列表转换为集合,它会自动去重,然后再将集合转换为列表即可
代码:
li1 = [1,2,3,2,1,5,6,7,6,5,8]
set1 = set(li1)
li1 = list(set1)
print(li1) #结果为:[1, 2, 3, 5, 6, 7, 8]
python中字典的增删改查及相关知识点
1 ‘‘‘ 2 数据划分:可变数据类型,不可变数据类型 3 不可变数据类型:tuple,str,bool,int 可哈希 4 可变数据类型: list, dict, set 不可哈希 5 dict key:必须是不可变数据类型 可哈希 6 dict value: 任意数据类型 7 dict 优点:二分法去查找 8 存储大量关系型数据 9 特点: 无序的 10 ‘‘‘ 11 12 #》》》增 13 14 #使用key增加,类似于list的索引改变值 15 #但是list中的索引必须在范围内,dict不同 16 17 dic1 = { 18 ‘name‘ : ‘python‘, 19 ‘age‘ : ‘1981‘, 20 ‘sex‘ : ‘male‘ 21 } 22 dic1[‘sex‘] = ‘men‘ #如果有键值则覆盖,如果没有键值则添加 23 print(dic1) #输出结果:{‘name‘: ‘python‘, ‘age‘: ‘1981‘, ‘sex‘: ‘men‘} 24 25 26 dic1 = { 27 ‘name‘ : ‘python‘, 28 ‘age‘ : ‘1981‘, 29 ‘sex‘ : ‘male‘ 30 } 31 dic1.setdefault(‘name‘,‘c‘) #有键值不做任何改变,没有键值才添加 32 dic1.setdefault(‘name1‘,‘java‘) #无论有无键值,返回值为待添加的后面的键值 33 print(dic1) #输出结果:{‘name‘: ‘python‘, ‘age‘: ‘1981‘, ‘sex‘: ‘male‘, ‘name1‘: ‘java‘} 34 35 #删 36 37 #pop()方法 38 dic1 = { 39 ‘name‘ : ‘python‘, 40 ‘age‘ : ‘1981‘, 41 ‘sex‘ : ‘male‘ 42 } 43 dic1.pop(‘name‘) #有这个键的话则默认返回值为键值‘python’ 44 print(dic1) #输出结果:{‘age‘: ‘1981‘, ‘sex‘: ‘male‘} 45 print(dic1.pop(‘name‘,‘没有这个‘)) #如果没有需要删除的键,默认返回None,也可自定义 输出结果:没有这个 46 47 #popitem() 随机删除一个键值对 48 dic1 = { 49 ‘name‘ : ‘python‘, 50 ‘age‘ : ‘1981‘, 51 ‘sex‘ : ‘male‘ 52 } 53 print(dic1.popitem()) #返回值为一个删除的键值对的元祖 输出结果:(‘sex‘, ‘male‘) 54 print(dic1) #输出结果:{‘name‘: ‘python‘, ‘age‘: ‘1981‘} 55 56 #clear() 清空字典,同list的clear差不多 57 dic1 = { 58 ‘name‘ : ‘python‘, 59 ‘age‘ : ‘1981‘, 60 ‘sex‘ : ‘male‘ 61 } 62 print(dic1.clear()) #输出结果:None 63 print(dic1) #输出结果:{} 64 65 66 ###》》》》改 67 68 #利用键值对修改,有键则覆盖,无键则添加 69 70 #update 只可意会不可言传 71 dic1 = { 72 ‘name‘ : ‘python‘, 73 ‘age‘ : ‘1981‘, 74 ‘sex‘ : ‘male‘ 75 } 76 dic2 = { 77 ‘name‘ : ‘java‘, 78 ‘hobby‘ : ‘coding‘ 79 } 80 81 print(dic2.update(dic1)) #输出结果:None 82 print(dic1) #输出结果:{‘name‘: ‘python‘, ‘age‘: ‘1981‘, ‘sex‘: ‘male‘} 83 print(dic2) #输出结果:{‘name‘: ‘python‘, ‘hobby‘: ‘coding‘, ‘age‘: ‘1981‘, ‘sex‘: ‘male‘} 84 85 ##查 86 87 dic1 = { 88 ‘name‘ : ‘python‘, 89 ‘age‘ : ‘1981‘, 90 ‘sex‘ : ‘male‘ 91 } 92 print(dic1.keys()) #输出结果:dict_keys([‘name‘, ‘age‘, ‘sex‘]) 93 print(dic1.values()) #输出结果:dict_values([‘python‘, ‘1981‘, ‘male‘]) 94 print(dic1.items()) #输出结果:dict_items([(‘name‘, ‘python‘), (‘age‘, ‘1981‘), (‘sex‘, ‘male‘)]) 95 96 # get方法 97 98 dic1 = { 99 ‘name‘ : ‘python‘, 100 ‘age‘ : ‘1981‘, 101 ‘sex‘ : ‘male‘ 102 } 103 print(dic1.get(‘name‘,‘没有这个键‘)) #输出结果:python 104 print(dic1.get(‘name1‘,‘没有这个键‘)) #输出结果:没有这个键 105 106 #小知识点 107 108 #》》》1《《《 109 a, b = (1, 2) 110 print(a,b) #输出结果:1 2 111 112 #》》》2《《《 113 114 dic1 = { 115 ‘name‘ : ‘python‘, 116 ‘age‘ : ‘1981‘, 117 ‘sex‘ : ‘male‘ 118 } 119 120 for k, v in dic1.items(): 121 print(k,v) #输出结果:name python 122 # age 1981 123 # sex male
以上是关于Python集合 (set) 的增删改查及 copy()方法的主要内容,如果未能解决你的问题,请参考以下文章