字典的keys和values的返回值是list,并不是set,set是用{}
set和元组类似,不可变对象,该对象所指向的内存中的值不能被改变。即元素不能修改值。
set内部是无序的,每次运行打印的结果会不一样。
见代码:
set1 = {'a', 'b', 'c'}
print(type(set1))
print('a' in set1)
lst1 = [1, 2, 3, 4, 5, 6, 6, 4, 5, 6]
set2 = set(lst1)
print(set2, type(set2))
回顾一下到目前为止,学过的python的数据类型及定义:
int1 = 3
print("int1 = ", int1, type(int1))
flt1 = 1.0
print("flt1 = ", flt1, type(flt1))
str1 = 'sdf'
print("str1 = ", str1, type(str1))
bool1 = True
print("bool1 = ", bool1, type(bool1))
lst1 = [1, 2, 'a', 'b', [1, 2, 'a', 'b']]
print("lst1 = ", lst1, type(lst1))
tup1 = (1, 2, 'a', 'b', [1, 2, 'a', 'b'])
print("tup1 = ", tup1, type(tup1))
dict1 = {
1: 'a',
2: 'b',
3: 'c',
4: 'd'
}
print("dict1 = ", dict1, type(dict1))
set1 = {1, 2, 'a', (3, 4, 'b')}
print("set1 = ", set1, type(set1))
运行结果:
因为set的特性,所有set嵌套时,只能嵌套不可变类型,但是我这里还是有个疑问,为什么能嵌套元组,而不能嵌套set呢?
经过网友们的解答,明白了其中原因,因为我代码中的元组的元素都是不可变的,所以这个元组的地址是固定的,假如我的这个元组里面增加了一个list,那这个元组就不是hashable的。
set2 = {1, 2, 'a', (3, 4, ['b', 's'])}
print("set2 = ", set2, type(set2))
set2 = {1, 2, 'a', (3, 4), 1, 2, 'a', (3, 4), 1, 2, 'a', (3, 4)}
print("set2 = ", set2, type(set2))
通过代码,能看得出来这个集合的元素是重复的,我们看看运行结果呢?
重复的元素被自动清除了。
集合常用方法
set3 = {2, 3, 's', 'd', 'f', 6}
print("set3 = ", set3, type(set3))
set3.add(5)
print("set3 = ", set3, type(set3))
set3.remove(5)
print("set3 = ", set3, type(set3))
set3.add(4)
set3.add(4)
print("set3 = ", set3, type(set3))
str2 = 'sadfadfa'
set4 = set(str2)
print("set4 = ", set4, type(set4))
print('set3 & set4 = ', set3 & set4)
print('set3 | set4 = ', set3 | set4)
print('set3 ^ set4 = ', set3 ^ set4)
print('set3 - set4 = ', set3 - set4)
print('set4 - set3 = ', set4 - set3)
运行结果:
其中用到了remove,其实这个方法不太友好,如果移除不存在的元素,会报错。所以要配合使用场景来决定是使用remove,还是discard。如果需要删除不存在元素报错,那就用remove。如果需要删除不存在元素,不报错,那就使用discard。
print("set3 = ", set3, type(set3))
set3.discard(15)
set3.discard(2)
set3.discard('ss')
print("set3 = ", set3, type(set3))
运行结果:
使用discard不会报错,成功运行。
pop函数,随机弹出一个元素;
clear函数,清空set;
判断元素是否在集合中存在,2 in set3;
集合的基本操作都囊括了,本文到此也结束了。