Python学习day7(集合、深浅copy及易错点)

集合

集合的创建

set1 = {'hyg', '[1, 2], 4, 5}
set2 = set( {'hyg', '[1, 2], 4, 5})

集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:

去重,把一个列表变成集合,就自动去重了。

l1 = [1, 1, 2, 3, 4, 4, 3, 2, 1, 5, 5]
set1 = set(l1)
l2 = list(set1)
print(l2)
#结果:[1, 2, 3, 4, 5]

关系测试,测试两组数据之前的交集、差集、并集等关系。

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# 交集
print(set1 & set2)
print(set1.intersection(set2))

# 并集
print(set1 | set2)
print(set1.union(set2))

# 反交集

print(set1 ^ set2)
print(set1.symmetric_difference(set2))

set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
# 差集
print(set1 - set2)
print(set1.difference(set2))

# 子集
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5, 6}
print(set1 < set2)  # True
print(set1.issubset(set2))

# 超集
print(set2 > set1)
print(set2.issuperset(set1))

集合的增、删(因为集合是无序的,所以没有改和查的方法)

set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set1.add('女神')
print(set1)

set1.update('abc')  #迭代着加
print(set1)

set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set1.remove('alex')
print(set1)

set1.pop()    #随机删除一个元素
print(set1)

set1.clear()   
print(set1)

del set1
print(set1)

frozenset()方法:将集合变成不可变集合类型

set1 = {1, 2, 3}
set2 = frozenset(set1)
print(set2) 

深、浅copy

赋值运算

l1 = [1,2,3]
l2 = l1
l1.append(666)
print(l2)           #[1, 2, 3, 666]
print(id(l1))       #2673545598344
print(id(l2))       #2673545598344

对于赋值运算来说,l1与l2指向的是同一个内存地址,所以他们是完全一样的。

浅copy

l1 = [1, 2, 3, [22, 11]]
l2 = l1.copy()
l1.append(999)
l2[3].append(666)
print(l1)             #[1, 2, 3, [22, 11, 666], 999]
print(l2)             #[1, 2, 3, [22, 11, 666]]
print(id(l1))         #1684921202568
print(id(l2))         #1684922070088
print(id(l1[-1]))     #1684891348688
print(id(l2[-1]))     #1684922070216

对于浅copy来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。

深copy

import copy
l1 = [1, 2, 3, [22, 11]]
l2 = copy.deepcopy(l1)
print(l1 is l2)             #False
print(l1[-1] is l2[-1])     #False

对于深copy来说,两个是完全独立的,改变任意一个的任何元素(无论多少层),另一个绝对不改变。

易错点

# 元组
# 如果元组中只有一个数据,且没有逗号,则该 '元组' 与里面的数据的数据类型相同。
# tu1 = (1,)
# tu2 = ('alex')
# tu3 = ([1,2,3],)
# print(tu1,type(tu1))
# print(tu2,type(tu2))
# print(tu3,type(tu3))

# 列表
# 列表与列表可以相加
# l1 = [1,2,3]
# l2 = ['alex','wusir']
# l3 = l1 + l2
# print(l3)
# print((1))
#
# l1 = [11, 22, 33, 44, 55, 66, 77, 88]
# 将列表中索引为奇数的元素,全部删除
# 方法一:切片+步长删除
# del l1[1::2]
# # print(l1)
# l1 = [11, 22, 33, 44, 55, 66, 77, 88]
# for i in range(len(l1)):
#     print(l1)
#     print(i)
#     if i % 2 == 1:
#         l1.pop(i)
#     print(l1)
#     print(i)
# print(l1)

# 在循环一个列表时,如果对列表中的某些元素进行删除,
# 那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。


# 方法二:
# l2 = []
#
# for i in range(len(l1)):
#     if i % 2 == 0:
#         l2.append(l1[i])
# print(l2)
# l1 = l2
# print(l1)
# l1 = [11, 22, 33, 44, 55, 66, 77, 88]
# # 方法三:倒着删除
# for index in range(len(l1)-1, -1, -1):
#     if index % 2 == 1:
#         l1.pop(index)
# print(l1)
# 在循环一个列表时,最好不要对此列表进行改变大小(增删)的操作。

# 字典
# fromkeys()
# dic1 = dict.fromkeys([1,2,3],'alex')
# print(dic1)

# 陷阱:
# dic1 = dict.fromkeys([1,2,3],[])
# print(dic1)
# # dic1[1].append('alex')
# print(dic1)
# print(id(dic1[1]))
# print(id(dic1[2]))
# print(id(dic1[3]))

#dic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'}
# 将 dic的键中含有k元素的所有键值对删除。
# for key in dic:
#     if 'k' in key:
#         dic.pop(key)
# dictionary changed size during iteration: 在循环一个字典时,不能改变字典的大小。
# l1 = []
# for key in dic:
#     if 'k' in key:
#         l1.append(key)
# # print(l1)
# for key in l1:
#     dic.pop(key)
# print(dic)
原文地址:https://www.cnblogs.com/hyg19910701/p/9520634.html