python之路day7 集合,深浅copy,以及基础数据类型中的坑

集合

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

以下是集合最重要的两点:

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

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

1,集合的创建。

set1 = set({1,2,'barry'})
set2 = {1,2,'barry'}
print(set1,set2)  # {1, 2, 'barry'} {1, 2, 'barry'}

2,集合的增。

复制代码
set1 = {'alex','wusir','ritian','egon'}
set1.add('景女神')
print(set1)

#update:迭代着增加
set1.update('A')
print(set1)
set1.update('老师')
print(set1)
set1.update([1,2,3])
print(set1)
复制代码

3,集合的删。

复制代码
set1 = {'alex','wusir','ritian','egon','barry'}

set1.remove('alex')  # 删除一个元素
print(set1)

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

set1.clear()  # 清空集合
print(set1)

del set1  # 删除集合
print(set1)
复制代码

4,集合的其他操作:

  4.1 交集。(&  或者 intersection)

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

  4.2 并集。(| 或者 union)

复制代码
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7}

print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7}
复制代码

  4.3 差集。(- 或者 difference)

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

   4.4反交集。 (^ 或者 symmetric_difference)

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 ^ set2)  # {1, 2, 3, 6, 7, 8}
print(set1.symmetric_difference(set2))  # {1, 2, 3, 6, 7, 8}

  4.5子集与超集

复制代码
set1 = {1,2,3}
set2 = {1,2,3,4,5,6}

print(set1 < set2)
print(set1.issubset(set2))  # 这两个相同,都是说明set1是set2子集。

print(set2 > set1)
print(set2.issuperset(set1))  # 这两个相同,都是说明set2是set1超集。
复制代码

5,frozenset不可变集合,让集合变成不可变类型。

s = frozenset('barry')
print(s,type(s))  # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>

 

深浅copy  

完全独立的copy一份数据,与原数据没有关系,深copy
如果一份数据(列表)第二层时,你想与原数据进行公用,浅copy。

1,先看赋值运算。

复制代码
l1 = [1,2,3,['barry','alex']]
l2 = l1

l1[0] = 111
print(l1)  # [111, 2, 3, ['barry', 'alex']]
print(l2)  # [111, 2, 3, ['barry', 'alex']]

l1[3][0] = 'wusir'
print(l1)  # [111, 2, 3, ['wusir', 'alex']]
print(l2)  # [111, 2, 3, ['wusir', 'alex']]
复制代码

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

2,浅拷贝copy。

复制代码
l1 = [1,2,3,['barry','alex']]

l2 = l1.copy() print(l1,id(l1)) # [1, 2, 3, ['barry', 'alex']] 2380296895816 print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2380296895048
l1[1] = 222
print(l1,id(l1)) # [1, 222, 3, ['barry', 'alex']] 2593038941128
print(l2,id(l2)) # [1, 2, 3, ['barry', 'alex']] 2593038941896
 
l1[3][0] = 'wusir' print(l1,id(l1[3])) # [1, 2, 3, ['wusir', 'alex']] 1732315659016 print(l2,id(l2[3])) # [1, 2, 3, ['wusir', 'alex']] 1732315659016
复制代码

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

3,深拷贝deepcopy。

复制代码
import copy
l1 = [1,2,3,['barry','alex']]
l2 = copy.deepcopy(l1)

print(l1,id(l1))  # [1, 2, 3, ['barry', 'alex']] 2915377167816
print(l2,id(l2))  # [1, 2, 3, ['barry', 'alex']] 2915377167048

l1[1] = 222
print(l1,id(l1))  # [1, 222, 3, ['barry', 'alex']] 2915377167816
print(l2,id(l2))  # [1, 2, 3, ['barry', 'alex']] 2915377167048

l1[3][0] = 'wusir'
print(l1,id(l1[3]))  # [1, 222, 3, ['wusir', 'alex']] 2915377167240
print(l2,id(l2[3]))  # [1, 2, 3, ['barry', 'alex']] 2915377167304
复制代码

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

基础数据类型中的坑

# 切片属于浅copy
# l1 = [1,2,3,[22,33]]
# l2 = l1[:]
# # l1.append(666)
# l1[-1].append(666)
# print(l2)
# 元组
# 如果元组中只有一个数据,且没有逗号,则该 '元组' 与里面的数据的数据类型相同。
# 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)
#列表可以与数字相乘

#
# 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)

# 面试题:创建字典的方式
#1,
# dic = {'name':'alex'}
#2
# dic = dict({'name':'alex'})
# print(dic)
#3, fromkeys()

# 陷阱:
# 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)

猜你喜欢

转载自www.cnblogs.com/python13/p/9489507.html