0507Python基础-set-深浅copy
1、基础数据类型的补充。
1,元组
tu1 = ('laonanhai')
tu2 = ('laonanhai',)
print(tu1, type(tu1))
print(tu2, type(tu2))
tu1 = (1)
tu2 = (1,)
print(tu1, type(tu1))
print(tu2, type(tu2))
元组里面如果只有一个元素且没有逗号,则该数据的数据类型与里面的元素相同。
tu1 = ([1, 2, 3])
tu2 = ([1, 2, 3],)
print(tu1, type(tu1))
print(tu2, type(tu2))
list
l1 = [111, 222, 333, 444, 555, ]
索引为奇数对应的所有元素全部删除。
方法一:
del l1[1::2]
print(l1)
方法二错误展示:
for index in range(len(l1)):
print('删除之前的index:%s'
% index)
print('删除之前的l1:%s'
% l1)
if index % 2 == 1:
del l1[index]
print('删除之后的index:%s'
% index)
print('删除之后的l1:%s'
% l1)
print(l1)
在循环一个列表时,最好不要改变列表的大小,会影响你的最终结果。
倒着删除。
for index in range(len(l1)-1, -1, -1):
if index % 2 == 1:
del l1[index]
print(l1)
dict
dic = dict.fromkeys('abc',666)
print(dic)
dic = dict.fromkeys([11,22,33],666)
print(dic)
dic = dict.fromkeys([1,2,3],[])
dic[1].append(666)
print(dic)
在循环dict中,最好不要改变dict的大小,会影响结果或者报错。
dic = {'k1': 'v1', 'k2': 'v2','k3': 'v3','name': 'alex'}
for i in dic:
if 'k' in i:
del dic[i]
l1 = []
for key in dic:
if 'k' in key:
l1.append(key)
# print(l1)
for key in l1:
del dic[key]
print(dic)
数据类型的转换:
str ---> list split
list --> str join
tuple ---> list
tu1 = (1, 2, 3)
l1 = list(tu1)
print(l1)
tu2 = tuple(l1)
print(tu2)
dic ----> list list(dic)(列表中的元素只有key)
dic = {'k1': 'v1', 'k2': 'v2','k3': 'v3',}
l1 = list(dic)
print(l1)
print(list(dic.keys()))
print(list(dic.values()))
print(list(dic.items()))
0, '', [], () {} ---> bool 都是Fasle
print(bool([0, 0, 0]))
2、基础数据类型 set。
集合是一个可变的数据类型,他是以{}形式存在的,空集合set(),
但是它要求它里面的元素是不可变的,集合是无序的,不重复的。
1,去重。
2,关系测试。
set1 = {1, 2, 3, 'abc', (1,2,3), True, }
print(set1)
set2 = {11, 11, 11, 22}
print(set2)
列表的去重
l1 = [11, 11, 22, 22, 33, 33, 33, 44]
l2 = list(set(l1))
l2.sort()
print(l2)
set1 = {'alex', 'WuSir', 'RiTiAn', 'egon', 'barry'}
增
set1.add('太白')
print(set1)
set1.update('abc')
set1.update([111, 2222, 333])
print(set1)
删
remove按元素删除
set1.remove('RiTiAn')
print(set1)
随机删除,有返回值 pop
print(set1.pop())
print(set1)
清空clear
set1.clear()
print(set1)
删除整体 del
del set1
print(set1)
# 查
for i in set1:
print(i)
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
交集 & intersetion
set3 = set1 & set2
print(set3)
print(set1.intersection(set2))
并集 | union
print(set1 | set2)
print(set1.union(set2))
差集 - difference
print(set1 - set2) # set1 独有
print(set2.difference(set1)) # set2 独有
反交集 ^
symmetric_difference
print(set1 ^ set2)
print(set1.symmetric_difference(set2))
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5, 6}
print(set1 < set2) # True set1 是set2的子集
print(set1.issubset(set2)) # True set1 是set2的子集
print(set2 > set1) # True set2 是set1的超集
print(set2.issuperset(set1)) # True set2
是set1的超集
set1 = frozenset({1, 2, 3, 'alex'})
print(set1,type(set1))
04,深浅copy。
l1 = [1, 2, 3]
l2 = l1
l3 = l2
l3.append(666)
print(l1, l2, l3)
对于赋值运算来说,指向的都是同一个内存地址,一变都变。
深浅copy
浅copy
l1 = [11, 22, 33]
l2 = l1.copy()
l1.append(666)
print(l1, id(l1))
print(l2, id(l2))
l1 = [11, 22, ['barry', [55, 66]], [11, 22]]
l2 = l1.copy()
l1[2].append('alex')
print(l1,id(l1))
print(l2,id(l2))
print(l1, id(l1[-1]))
print(l2, id(l2[-1]))
对于浅copy来说,对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始
,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
深copy
import copy
l1 = [11, 22, 33]
l2 = copy.deepcopy(l1)
l1.append(666)
print(l1, id(l1))
print(l2, id(l2))
l1 = [11, 22, ['barry']]
l2 = copy.deepcopy(l1)
l1[2].append('alex')
print(l1, id(l1[-1]))
print(l2, id(l2[-1]))
深copy 完全独立。
s1 = 'alex'
s2 = 'alex'
l1 = [1, 2, 3]
l2 = [1, 2, 3]
l1.append(666)
print(l1, l2)
对于切片来说,这是浅copy。
l1 = [1, 2, 3, 4, 5, 6, [11,22]]
l2 = l1[:]
l1.append(666)
print(l1, l2)
l1[-1].append(666)
print(l1, l2)