python数据类型(集合set)

集合
 
       集合是无序的对象集,它和字典一样使用花括号,但没有键值对的概念。集合属于可变的数据类型,一般用于保持序列的唯一性—— 也就是同样的元素仅出现一次。
 
       在使用集合时一定要注意集合的“无序”和“唯一”两个特点,避免出错。
 
一、集合的创建
s = set()  # 创建一个空集合

s1 = {}  # 这是创建一个空字典,而非集合
print(type(s1))
# <class 'dict'>

s2 = {2, 'hello', True, 3.14}  # 创建四个元素的集合

  

       集合的元素是唯一的,当集合出现不唯一的字符时,创建的集合中只会保存一个。
set1={1,2,3,3,4,2}
print(set1)
# {1, 2, 3, 4}

  注意:布尔值True和False在底层分别是以1和0保存的,因此如果同时出现在集合中的时候,会去掉后面的值。

set2 = {3.14, True, 'Jack', 1, ''}    # 去除1
print(set2)
# {'', True, 3.14, 'Jack'}

二、添加元素

       语法:s.add(x)

       将元素X添加到集合S中,如果元素存在,则不进行任何操作。

s={'Jack','Rose',"Mery"}
s.add('John')
print(s)
# {'Rose', 'Mery', 'John', 'Jack'}

  

三、删除元素

       语法:s.pop()

       随机删除集合里的一个元素。
s = {'Jack', 'Rose', "Mery"}
s.pop()   # 随机删除
print(s)
# {'Rose', 'Jack'}

  

       语法:s.remove(element)

       删除集合里指定(element)的值,如值不存在,报错。

s = {'Jack', 'Rose', "Mery"}
s.remove('Rose')
print(s)
# {'Mery', 'Jack'}

  

四、集合合并

       语法:s.update(iterable)

       将可迭代对象iterable拼接到s1里,去重。

s1 = {'Jack', 'Rose', "Mery"}
s2={'Rose','john'}

s1.update(s2)  # 集合拼接
print(s1)
# {'Rose', 'Jack', 'john', 'Mery'}

l1=['Rose','john']
s1.update(l1)   # 列表拼接
print(s1)
# {'Rose', 'Jack', 'john', 'Mery'}

  

五、清空元素

       将集合清空,留下一个空集合set()

s = {'Jack', 'Rose'}
s.clear()
print(s)
# set()

  

 六、集合运算

  
  • set支持减法运算符(求set1和set2的差集,set1中有,set2中无)
  • set支持&运算符(求set1和set2的交集,set1中有,set2中也有)
  • set支持|运算符(求set1和set2的并集,set1有,或set2中有)
  • set支持^运算符(求set1和set2的交集的补集)
  • set不支持加法运算符
set1 = {1, 2, 3, 4, 5}
set2 = {3, 4, 5, 6, 7}
print(set1 - set2)
# {1, 2}
print(set1 & set2)
# {3, 4, 5}
print(set1 | set2)
# {1, 2, 3, 4, 5, 6, 7}
print(set1 ^ set2)
# {1, 2, 6, 7}
print(set1 + set2)
# TypeError

  

集合方法

       合集:使用union()方法。(同|运算符)

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

  

       交集:使用intersection()方法(同&运算符)

print(set1.intersection(set2))
# {3, 4, 5}

  

       差集:使用difference()方法(同减号运算符)

print(set1.difference(set2))
# {1, 2}

  

 七、集合存储原理

        集合存储原理同字典存储原理相似,区别是字典里的键是可哈希,而集合里所有元素是可哈希,即内部通过哈希函数把值转换成一个数字。

v = hash('Jack')
print(v)  # 8690505197273509452

v1 = hash((11, 22, 33, 44))
print(v1)  # 8386256510965472093

  

       目前可哈希的数据类型:int、bool、str、tuple,而list、set是不可哈希的。
 
       总结:集合的元素只能是int、bool、str、tuple。
 

  •  转换成功
v1=[11,22,33,12,11,99]
v2=set(v1)
print(v2)   #(11,22,33,12,11,99)

  

  • 转换失败
v1=[11,22,['zhangsan','lisi'],33]
v2=set(v1)  #报错,元素是列表,不可哈希

  

        集合在底层也采用哈希算法,因此集合的查找效率非常高(数据量大了才明显),原理在字典中叙述过,可以参考字典2。

原文地址:https://www.cnblogs.com/shixiaoxun/p/14379755.html