欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python中的集合

程序员文章站 2022-03-07 16:13:55
1.dict中的fromkeys(a, b)函数: 把a迭代后的每一个元素作为一个key,value都是相同的b 这时如果改变b,那么每一个value都将会改变: 2.集合(set) 一般不是很常用. set中的元素是不重复的.无序的.里面的元素必须是可hash的(int, str, tuple,b ......

1.dict中的fromkeys(a, b)函数:

  把a迭代后的每一个元素作为一个key,value都是相同的b

dic = dict.fromkeys(["a", "b"], ["1", "2"])
print(dic) #结果:{'a': ['1', '2'], 'b': ['1', '2']}
dic = dict.fromkeys("abcd", ["1", "2"])
print(dic) #结果:{'a': ['1', '2'], 'b': ['1', '2'], 'c': ['1', '2'], 'd': ['1', '2']}

  这时如果改变b,那么每一个value都将会改变:

dic.get("a").append("888")
print(dic) #结果是{'a': ['1', '2', '888'], 'b': ['1', '2', '888']}

2.集合(set)

  一般不是很常用. set中的元素是不重复的.无序的.里面的元素必须是可hash的(int, str, tuple,bool), 我们可以这样来记. set就是dict类型的数据但是不保存value, 只保存key. set也用{}表示

  set集合中的元素必须是可hash的, 但是set本身是不可hash得. set是可变的.

  2.1增删改查

    增加:

      add(a)函数,a必须是set中没有的

      a.update(b):迭代更新,把b迭代,然后加入集合a中

        例:

s = {"刘嘉玲", '关之琳', "王祖贤"}
s.update("麻花藤") # 迭代更新
print(s) #{'王祖贤', '花', '刘嘉玲', '麻', '关之琳', '藤'}

    删除:

      pop():随机删除

      remove(a):直接删除a,如果集合中不存在a,则会报错

      clear():清空

    修改:

      因为没有索引,无法定位,只能用先删除,后增加的方法进行修改

    查询:

      集合是一个可迭代对象,可以用for循环遍历

    常用操作:

s1 = {"a", "b", "c"}
s2 = {"c", "d", "e"}

# 交集
# 两个集合中的共有元素
print(s1 & s2)  # {'c'}
print(s1.intersection(s2))  # {'c'}

# 并集
print(s1 | s2)  # {'e', 'd', 'b', 'a', 'c'}
print(s1.union(s2))  # {'e', 'd', 'b', 'a', 'c'}

# 差集
print(s1 - s2)  # {'a', 'b'}
print(s1.difference(s2))  # {'a', 'b'}

# 反交集
print(s1 ^ s2)  # 两个集合中单独存在的数据 {'e', 'a', 'd', 'b'}
print(s1.symmetric_difference(s2))  # 两个集合中单独存在的数据 {'e', 'a', 'd', 'b'}


s1 = {"a", "b"}
s2 = {"a", "b", "c"}

# 子集
print(s1 < s2) # set1是set2的⼦子集吗? True
print(s1.issubset(s2))
# 超集
print(s1 > s2) # set1是set2的超集吗? False
print(s1.issuperset(s2))

3.深浅拷贝

  3.1 引用赋值

    直接赋值. 其实是把内存地址交给变量. 并不是复制一份内容. 所以.lst1的内存指向和lst2是一样的. lst1改变了, lst2也发生了改变

1 lst1 = ["a", "b", "c", "d"]
2 lst2 = lst1
3 
4 print(lst1)  # ['a', 'b', 'c', 'd']
5 print(lst2)  # ['a', 'b', 'c', 'd']
6 lst1.append("e")
7 print(lst1)  # ['a', 'b', 'c', 'd', 'e']
8 print(lst2)  # ['a', 'b', 'c', 'd', 'e']

   3.2  浅拷贝

    创建一个与已有的列表内容相同的另一个列表,有两种方法,一种是使用列表自带的copy()方法,另一种是使用切片.

#1
lst1 = ["何炅", "杜海涛","周渝民"] lst2 = lst1.copy()#列表自带的方法 lst1.append("李嘉诚") print(lst1) print(lst2) print(id(lst1), id(lst2)) 结果: 两个lst完全不一样. 内存地址和内容也不一样. 发现实现了内存的拷贝
#2 lst1 = ["何炅", "杜海涛","周渝民", ["麻花藤", "马芸", "周笔畅"]] lst2 = lst1[:]#使用切片来复制 lst1[3].append("无敌是多磨寂寞") print(lst1) print(lst2) print(id(lst1[3]), id(lst2[3])) 结果: ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']] ['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']] 4417248328 4417248328

    从第二部分可以看出,浅拷贝. 只会拷贝第一层. 第二层的内容不会拷贝. 所以被称为浅拷贝

   3.3深拷贝

Python中的集合
import copy
lst1 = ["何炅", "杜海涛","周渝民", ["麻花藤", "马芸", "周笔畅"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("无敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
结果:
['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅', '无敌是多磨寂寞']]
['何炅', '杜海涛', '周渝民', ['麻花藤', '马芸', '周笔畅']]
4447221448 4447233800
View Code

    深度拷贝. 把元素内部的元素完全进行拷贝复制. 不会产生一个改变另一个跟着改变的问题