一、集合
集合是无序的,不可重复的数据集合。集合里面的元素是不可哈希的(不可变类型)(元素、字符串、数字),但是集合本身不可哈希(所以集合做不了字典的键)。
主要功能:
1.去重,把一个列表变成集合,就自动去重了。
2.关系测试,测试两组数据之前的交集、差集、并集等关系。
创建集合
set = {‘a‘,‘b‘,‘c‘}
set = set({‘a‘,‘b‘,‘c‘})
print(set)
1.去重
set = {1,2,3,3,4,5}
print(set)
2.增
set.add(‘asd‘) #增加
set.update(‘asd‘) #迭代加,一个一个加
3.删除
set.remove(‘alex‘) #按元素删
set.pop() #随机删除
set.clear() #清空,返回值为 set()
del set #删除字集
4.查
print(set)
5.其他操作
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
1)交集(set1和set2相同元素)
print(set1 & set2)
print(set1.intersection(set2))
2)并集(set1和set2所有的元素)
print(set1 | set2)
print(set1.union(set2))
3)差集(set1里有set2里没有的元素)
print(set1 - set2)
print(set1.difference(set2))
4)反交集(set1和set2不同的元素)
print(set1 ^ set2)
print(set1.symmetric_difference(set2))
5)子集(set1里元素set2里是否都有)
print(set1 < set2)
print(set1.issubset(set2))
6)超集(set2里是否有se1所有元素)
print(set2 > set1)
print(set2.issuperset(set1))
7)不可变合集(frozenset)
set1 = {4,5}
set2 = frozenset(set1)
print(set2,type(set2))
结果:frozenset({4, 5}) <class ‘frozenset‘>
二、深入copy
1.赋值运算
l1 = [1,2,3,[‘alex‘,‘barry‘]]
l2 = l1
l1[0] = 111
print(l1 is l2)
l1和l2指向的都是同一个内存地址,所以更改l1,l2也会更改。
2.浅copy
l1 = [1,2,3,[‘alex‘,‘barry‘]]
l2 = l1.copy()
l1.append(‘as‘)
print(l1 is l2) #结尾为False,l1加上内容后,l1不等于l2
l1 = [1,2,3,[‘alex‘,‘barry‘]]
l2 = l1.copy()
l1[3].append(‘sa‘)
print(l1[3] is l2[3]) 结果为True,l1里的列表变换l2里的列表也跟着变换。
结论:浅copy第一层是不一样的内存地址,但是第二层或更深层还是用的同一个内存地址。
3.深copy
为了解决浅copy问题,使用copy模块。
import copy
l1 = [1,2,3,[‘alex‘,‘barry‘]]
l2 = copy.deepcopy(l1)
l1[3].append(‘sa‘)
print(l1 is l2)
这样l1和l2的内存地址就完全就不一样了
三、枚举
可在列打印列表时加上对应的数字,类似1.alex 2.银角 3.女神 4.egon 5.太白
li = [‘alex‘,‘银角‘,‘女神‘,‘egon‘,‘太白‘]
for index,name in enumerate(li,1):
print(index,name)
四、列表
列表中最好不要删除元素,删除后索引会发生更改。
lis = [1,2,3,4,5] #要求:用循环删除2,4 不能正着删除,删除后索引会改变,可以倒着删除,或者用新列表替换。
方法一:
for i in range(len(lis)-1,-1,-1): #range(len(lis)) 0,4 第一个-1 从4开始,第二个-1 到-1结束,第三个-1 倒着输出
if i % 2 != 0:
del lis[i]
print(lis)
方法二:
l = []
for i in lis:
if lis.index(i) % 2 ==0:
l.append(i)
lis = l
print(lis)
五、字典
添加:
dic = dict.fromkeys([1,2,3],‘春哥‘)
print(dic) #结果:{1: ‘春哥‘, 2: ‘春哥‘, 3: ‘春哥‘}
dic = dict.fromkeys([1,2,3],[])
print(dic) # {1: [], 2: [], 3: []}
dic[1].append(‘AS‘)
print(dic) #这几个字典共用一个内存地址,修改一个都更改。
删除:
dic = {‘k1‘:‘v1‘,‘k2‘:‘v2‘,‘a3‘:‘v3‘} #删除键里包含k的键值对
方法一:
s = {}
for i in dic:
if ‘k‘ not in i:
s = {i,dic[i]}
print(s)
方法二:
l = []
for i in dic:
if ‘k‘ in i:
l.append(i)
for i in l:
del dic[i]
print(dic)
六、元祖
如果元祖里面只有一个元素且不加,那此元素是什么类型,就是什么类型。
tu1 = (1)
tu2 = (1,)
print(tu1,type(tu1),tu2,type(tu2)) #结果:1 <class ‘int‘> (1,) <class ‘tuple‘>