当前位置: 移动技术网 > IT编程>脚本编程>Python > Python中的集合

Python中的集合

2018年07月19日  | 移动技术网IT编程  | 我要评论

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深拷贝

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网