天天看点

Python数据类型之集合一、可变集合(set)二、不可变集合frozenset

集合(set)与字典类似,也是由大括号{}表示,多个元素之间用逗号‘,’分隔。需要注意集合是无序且不重复的,集合中的元素必须是不可变数据(字符串,整数,元祖)。同数学中的集合一样,集合可以执行集合的并、交、差运算。注:对于 并集, 交集, 差集 等的返回值,与最左边的操作数具有相同的类型。例如:s & t  取交集。s集合是一个set类型的集合,t集合是一个frozenset类型的集合,则返回的结果将是set类型的集合。

集合有两种不同的类型,可变集合(set)和不可变集合:①可变集合可以添加或删除元素,但可变集合所存储的元素不能被哈希,因此不能用做字典的键;②不可变集合(frozenset)不能添加或删除元素,但元素是可哈希的,可以做字典的键

一、可变集合(set)

1、set的创建

# -*- coding:utf-8 -*-
# author: kenny

# 创建:用{}直接创建,也可以用工厂函数set()来创建
set_1 = {1, 2, 3, 4}
print(set_1)  # {1, 2, 3, 4}
set_2 = set()
print(set_2)  # set()

# 集合会把传入的字符串拆分为单个字符作为集合的成员
set_3 = set("java")
print(set_3)  # {'a', 'j', 'v'}
# 当传入列表时,集合会把列表内的元素作为集合成员。
set_4 = set(['python', 'c', 'c++'])
print(set_4)  # {'c', 'python', 'c++'}

# 空集合只能使用set()函数来定义,直接使用{}定义的是空字典
s1 = set()
s2 = {}
print(type(s1))  # <class 'set'>
print(type(s2))  # <class 'dict'>
           

2、增加

(1)set1.add('元素')--->将元素无序的插入集合set1中

set_1 = {1, 2, 3, 4}
set_1.add('java')
print(set_1)  # {1, 2, 3, 4, 'java'}
           

(2)set1.update("元素")--->将元素迭代的无序的加入集合set1中

set_1 = {1, 2, 3, 4}
set_1.update("java")
print(set_1)  # {1, 2, 3, 4, 'j', 'a', 'v'}
           

3、删除

(1)set1.pop()---->随机删除,返回值为删除掉的元素

set_1 = {1, 2, 3, 4}

s = set_1.pop()

print(set_1) # {2, 3, 4}

print(s) # 1
           

(2)set1.remove("元素")--->按元素删除,若无该元素则报错

set_1 = {1, 2, 3, 4}

set_1.remove(2)

print(set_1) # {1, 3, 4}
           

 (3)set1.discard(obj)---->如果集合内存在指定元素,则删除,若不存在,不做任何事

set_1 = {1, 2, 3, 4}
set_1.discard(1)
print(set_1)  # {2, 3, 4}
           

(4)set1.clear()--->清空集合。输出集合的时候是set(),为了与空字典{}相区分

set_1 = {1, 2, 3, 4}

set_1.clear()

print(set_1) # set()
           

(5)del set1------>删除整个集合

set_1 = {1, 2, 3, 4}

del set_1

print(set_1) # NameError: name 'set_1' is not defined
           

4、查找

        因为集合是无序的,所以取某一个值,只能用for遍历

set_1 = {1, 2, 3, 4}
for i in set_1:
    print(i, end=' ')  # 1 2 3 4

print(set_1(1))  # TypeError: 'set' object is not callable
           

        我们虽然不能直接查找集合,但是我们可以用in操作符查看集合中是否存在对象

set_1 = {1, 2, 'java'}
print('1' in set_1)  # False
print(1 in set_1)  # True
           

5、交集,并集,差集

s1 = {1, 'java', ('tuple_1', 'tuple_2', 3)}
s2 = {'do', 're', 'mi', 1, ('tuple_1', 'tuple_2', 3)}
s_jiao = s1 & s2
s_bing = s1 | s2
s_cha = s1 - s2

# 交集
print(s_jiao)  # {1, ('tuple_1', 'tuple_2', 3)}
print(s1.intersection(s2))  # {1, ('tuple_1', 'tuple_2', 3)}

# 并集
print(s_bing)  # {'re', 1, ('tuple_1', 'tuple_2', 3), 'java', 'mi', 'do'}
print(s1.union(s2))  # {'re', 1, ('tuple_1', 'tuple_2', 3), 'do', 'mi', 'java'}

# 差集
print(s_cha)  # {'java'}
print(s1.difference(s2))  # {'java'}

# 对称差集:去掉交集后的元素
print(s1 ^ s2)  # {'re', 'do', 'mi', 'java'}
print(s1.symmetric_difference(s2))  # {'java', 'mi', 'do', 're'}

# s1与s2取交集,然后用结果更新s1
s1.intersection_update(s2)
print(s1)  # {1, ('tuple_1', 'tuple_2', 3)}
print(s2)  # {1, ('tuple_1', 'tuple_2', 3), 'do', 'mi', 're'}

# s1与s2取差集,然后用结果更新s1
s1.difference_update(s2)
print(s1)  # {'java'}
print(s2)  # {'do', 1, 'mi', ('tuple_1', 'tuple_2', 3), 're'}

# s1与s2取对称差集,然后用结果更新s1
s1.symmetric_difference_update(s2)
print(s1)  # {'mi', 'java', 'do', 're'}
print(s2)  # {'mi', 1, 'do', 're', ('tuple_1', 'tuple_2', 3)}
           

二、不可变集合frozenset

        不可变集合不可以增加删除集合中的元素,该集合中的内容是不可改变的,类似于字符串、元组。

        不可变集合,除了内容不能更改外,其他功能及操作跟可变集合set一样

# 不可变集合的创建
fset = frozenset((1,2,3,4,5))
print(fset)  # frozenset({1, 2, 3, 4, 5})