Python_集合、深浅copy、枚举

集合set

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

1、集合的创建。

三种方法:1、直接set()  只能创建一个元素且不能是 int,否则会报错

                   2、set({})可以随便创建

                   3、set = {}

set1 = set('a')
set2 = set({'a', 1})
set3 = {1, 2, 'barry'}
print(set1, type(set1))
print(set2, type(set2))
print(set3, type(set3))

{'a'} <class 'set'>
{1, 'a'} <class 'set'>
{1, 2, 'barry'} <class 'set'>

2、集合的增

1)、直接增加

set.app('a)

2)、迭代增加  update()

set.update('a')   注意:a会被分解成最小元素,分别添加

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

set1.update('AB')
print(set1)
set1.update('老师')
print(set1)
set1.update([1,2,3])
print(set1)

{'wusir', '女神', 'alex', 'ritian'}
{'ritian', 'A', 'B', 'wusir', '女神', 'alex'}
{'', 'ritian', 'A', '', 'B', 'wusir', '女神', 'alex'}
{'', 1, 2, 3, 'ritian', 'A', '', 'B', 'wusir', '女神', 'alex'}

3、集合的删
1)、set.remove('a')    删除指定元素,每次只能删除一个元素

2)、set.pop()         随机删除一个元素

3)、set.clear()       清空集合

4)、del set                  删除集合

set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
set1.remove('alex')  # 删除一个元素
print(set1)
set1.pop()  # 随机删除一个元素
print(set1)
set1.clear()  # 清空集合
print(set1)

{'ritian', 'barry', 'egon', 'wusir'}
{'barry', 'egon', 'wusir'}
set()

4、集合的其他操作

1)、交集  (&  或者  intersection)

set1 = {'as', 23, 'zx', 46, 55}
set2 = {'qw', 55, 46, 'zx', 8}
print(set1 & set2)
print(set1.intersection(set2))

{'zx', 46, 55}
{'zx', 46, 55}

2)、并集  (| 或者 union)

set1 = {'as', 23, 'zx', 46, 55}
set2 = {'qw', 55, 46, 'zx', 8}
set3 = {'er', 78, 46, 'zx', 89}
print(set1 | set2 | set3)
print(set1.union(set2))

{'qw', 8, 46, 78, 'as', 23, 55, 89, 'er', 'zx'}
{'qw', 8, 46, 'as', 23, 55, 'zx'}

3)、差集  (- 或者 difference)
set1 - set2  是求 set1 中不同于 set2 的元素

set2 - set1  是求 set2 中不同于 set1 的元素

set1 = {'as', 23, 'zx', 46, 55}
set2 = {'qw', 55, 46, 'zx', 8}
set3 = {'er', 78, 46, 'zx', 23}
print(set1 - set2 - set3)
print(set1.difference(set2))
print(set2.difference(set1))

{'as'}
{'as', 23}
{8, 'qw'}

4)、反交集     (^  或者 symmetric_difference)

set1 = {'as', 23, 'zx', 46, 55}
set2 = {'qw', 55, 46, 'zx', 8}
set3 = {'er', 78, 46, 'zx', 23}
print(set1 ^ set2 ^ set3)
print(set1.symmetric_difference(set2))
print(set2.symmetric_difference(set1))

{'er', 8, 46, 78, 'as', 'zx', 'qw'}
{8, 'as', 23, 'qw'}
{8, 'as', 23, 'qw'}

5)、子集与超集 

set1 = { 'zx', 46, 55}
set2 = {'qw', 55, 46, 'zx', 8}
print(set1 < set2)
print(set1.issubset(set2))
print(set2 > set1)
print(set2.issuperset(set1))

True
True
True
True

5、frozenset 不可变集合,让集合变成不可变类型
1)、frozenset 转换的结果是最小元素的集合,但是可以转换 list ,然后编辑。(可以用来列表去重)

2)、frozenset 会将中间空格当成一个单个的元素生成。

s = frozenset('yang zhan')
print(s)

({'y','a','n','g',' ','z','h'})


li = ['qw', 'as', 23, 'as', 23, 4]
s = frozenset(li)
print(s, type(s))
s1 = list(s)
print(s)
s1.remove(4)
print(s1)

frozenset({'qw', 'as', 4, 23}) <class 'frozenset'>
frozenset({'qw', 'as', 4, 23})
['qw', 'as', 23]

深浅copy

1、赋值运算

l1 与 l2 指向的是同一内存地址,他们完全是一样的。

l1 = [1, 2, 4, ['a', ['er'], 'w', 5]]
l2 = l1
l1[3][0] = 7
print(l1, id(l1))
print(l2, id(l2))

[1, 2, 4, [7, ['er'], 'w', 5]] 6771080
[1, 2, 4, [7, ['er'], 'w', 5]] 6771080

2、浅拷贝 copy
对于浅 copy 来说,第一层创建的是新的内存地址,而从第二层开始,指向的都是同一内存地址

,所有对于第二层以及更深的层数来说保持一致性。

l1 = [1, 2, 4, ['a', ['er'], 'w', 5]]
l2 = l1.copy()
print(l1, id(l1))
print(l2, id(l2))

[1, 2, 4, ['a', ['er'], 'w', 5]] 6771080
[1, 2, 4, ['a', ['er'], 'w', 5]] 7154376

3、深拷贝 deepcopy
深拷贝,两个完全独立的,改变任意一个的元素,无论多少层,两一个绝不改变。

import copy
l1 = [1, 2, 4, ['a', ['er'], 'w', 5]]
l2 = copy.deepcopy(l1)
l1[3][0] = 7
print(l1, id(l1))
print(l2, id(l2))

[1, 2, 4, [7, ['er'], 'w', 5]] 8892680
[1, 2, 4, ['a', ['er'], 'w', 5]] 8894408

enumerate : 枚举 


enumerate : 枚举  ,对于一个可迭代的(iterable)/ 可遍历的对象(如 list、str),enumerate 将其组成一个索引序列,利用它可以同时获得索引和值。

li = ['电视', '电脑', '手机', '厨具']
for i in enumerate(li):
    print(i)
for index,name in enumerate(li,1): print(index,name)
for index,name in enumerate(li,10): print(index,name) (0, '电视') (1, '电脑') (2, '手机') (3, '厨具')
1 电视 2 电脑 3 手机 4 厨具
10 电视 11 电脑 12 手机 13 厨具
原文地址:https://www.cnblogs.com/Chong-Yang/p/8086924.html