set集合

set是一个无序且不重复的元素集合,有以下优点:

  • 1、访问速度快
  • 2、解决重复问题

1、set创建:

#字符串拆解形成set集合;其中字符串中重复字符,咋set集合中只会显示一个
>>> s1 = set("chengdd") #2个字符d
>>> s1
{'c', 'g', 'e', 'd', 'n', 'h'}    #只包含一个字符d
#list元素形成set集合,list如果有多个相同元素在集合中只显示一个;其中list元素可以为int/str
>>> s2 = set(["chengd","xrd",99,101,99])
>>> s2
{101, 99, 'chengd', 'xrd'}
#直接{}创建set集合
>>> s3 = {"chengd",999}
>>> s3
{'chengd', 999}

  注:

  • 在list元素创建set集合时,list中不能包list/dict元素;{}创建set集合时不能包含list/dict
#list元素不能包含list/dict
>>> s4 = set(["chengd","xrd",99,101,99,[1,2,3]])
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    s4 = set(["chengd","xrd",99,101,99,[1,2,3]])
TypeError: unhashable type: 'list'
#{}创建元素不能包含list/dict
>>> s5 = {1,2,"chengd",[1,2,3]}
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    s5 = {1,2,"chengd",[1,2,3]}
TypeError: unhashable type: 'list'
>>> s6 = {1,2,"chengd",{"name":"xrd"}}
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    s6 = {1,2,"chengd",{"name":"xrd"}}
TypeError: unhashable type: 'dict'
  • 字典创建set集合时,集合元素为key
>>> old_dict = {
    "#1":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 },
    "#2":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 },
    "#3":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 },
}
>>> new_dict = {
    "#1":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 800 },
    "#3":{ 'hostname':c1, 'cpu_count': 2, 'mem_capicity': 80 },
    "#4":{ 'hostname':c2, 'cpu_count': 2, 'mem_capicity': 80 },
}
>>> print(new_dict.keys())
dict_keys(['#3', '#4', '#1'])
>>> old_set = set(old_dict)
>>> new_set = set(new_dict)
>>> old_set
{'#3', '#2', '#1'}
>>> new_set
{'#3', '#4', '#1'}

2、set常用方法:

  • set.add(value):添加单个元素;添加多个元素报错
>>> s2
{101, 99, 'chengd', 'xrd'}
>>> s2.add("age")
>>> s2
{101, 99, 'chengd', 'xrd', 'age'}
>>> s2.add("ages",123)
Traceback (most recent call last):
  File "<pyshell#20>", line 1, in <module>
    s2.add("ages",123)
TypeError: add() takes exactly one argument (2 given)
  • set.clear():清空集合元素
>>> s2
{101, 99, 'chengd', 'xrd', 'age'}
>>> s2.clear()
>>> s2
set()
  • set.copy():浅拷贝set集合元素
>>> s1
{'c', 'g', 'e', 'd', 'n', 'h'}
>>> s2 = s1.copy()
>>> s2
{'h', 'c', 'e', 'g', 'n', 'd'}
#深浅拷贝和直接赋值区别:http://www.cnblogs.com/chengd/articles/7020282.html
  • set1.difference(set2):对比set1和set2,set1与set2不同的元素将会输出到成为新的set集合。(注意比较顺序)
>>> s1 = {1,2,3,4,5}
>>> s2 = {3,4,5,6,7,8}
>>> s1
{1, 2, 3, 4, 5}
>>> s2
{3, 4, 5, 6, 7, 8}
>>> s1.difference(s2)
{1, 2}    #s1在前面则表示s1包含但s2不包含元素
>>> s2.difference(s1)
{8, 6, 7}   #s2在前面则表示s2包含但s1不包含元素

注:set1.difference(set2)的结果可以赋给新的set集合

>>> s3 = s1.difference(s2)
>>> s3
{1, 2}
>>> s4 = s2.difference(s1)
>>> s4
{8, 6, 7}
  • set1.difference_update(set2):对比set1和set2;set1和set2相同的选项将被去除,set1被改变,set2不变
>>> s1
{2, 3, 4}
>>> s2
{3, 4, 5, 6, 7, 8}
>>> s1.difference_update(s2)
>>> s1
{2}
>>> s2
{3, 4, 5, 6, 7, 8}
  • set.discard():删除单个元素
>>> s1
{1, 2, 3, 4, 5}
>>> s1.discard(1)
>>> s1
{2, 3, 4, 5}
>>> s1.discard(5)
>>> s1
{2, 3, 4}
  • set1.intersection(set2):取set1和set2交集;结果可以赋给新的集合
>>> s1
{2, 3, 4}
>>> s2
{3, 4, 5, 6, 7, 8}
>>> s1.intersection(s2)
{3, 4}
>>> s3 = s1.intersection(s2)
>>> s3
{3, 4}
  • set1.intersection_update(set2):取set1和set2交集;set1为交集结果
>>> s1
{1, 3, 5, 7}
>>> s2
{3, 4, 5, 6, 7, 8}
>>> s1.intersection_update(s2)
>>> s1
{3, 5, 7}
>>> s2
{3, 4, 5, 6, 7, 8}
  • set1.isdisjoint(set2):判断set1和set2是否有交集,没有返回True
#有交集返回Flase
>>> s1
{3, 5, 7}
>>> s2
{3, 4, 5, 6, 7, 8}
>>> s1.isdisjoint(s2)
False
#没有交集返回True
>>> s1 = {11,12,13}
>>> s2
{3, 4, 5, 6, 7, 8}
>>> s1.isdisjoint(s2)
True
  • set1.issuperset(s2):判断set1是否是set2父集,是返回真
>>> s1 = {1,2,3,4,5}
>>> s2 = {1,2,3}
>>> s3 = {11,12,13}
>>> s1.issuperset(s2)
True
>>> s1.issuperset(s3)
False
  • set1.issubset():判断set1是否是set2子集,是返回真
>>> s1 = {1,2,3}
>>> s2 = {11,12,13}
>>> s3 = {1,2,3,4,5,6}
>>> s1.issubset(s3)
True
>>> s2.issubset(s3)
False
  • set1.pop():从左到右删除元素,并输出结果;也可以直接赋值
>>> s2
{11, 12, 13}
>>> s3
{1, 2, 3, 4, 5, 6}
>>> s3.pop()
1
>>> s3.pop()
2
>>> s3
{3, 4, 5, 6}
>>> i = s3.pop()    #赋值
>>> i
3
>>> s2
{11, 12, 13}
  • set.remove(value):删除指定元素
>>> s = {1,2,3,4,5,6}
>>> s.remove(1,3,4)    #一次不能删除多个元素
Traceback (most recent call last):
  File "<pyshell#117>", line 1, in <module>
    s.remove(1,3,4)
TypeError: remove() takes exactly one argument (3 given)
>>> s.remove(14)    #删除不存在元素报错
Traceback (most recent call last):
  File "<pyshell#118>", line 1, in <module>
    s.remove(14)
KeyError: 14
>>> s.remove(4)
>>> s
{1, 2, 3, 5, 6}
  • set1.symmetric_difference(set2):取set1和set2差集,可用于赋值新集合
>>> s1
{1, 2, 3}
>>> s2
{1, 2, 3, 4, 5}
>>> s1.symmetric_difference(s2)
{4, 5}
>>> s2.symmetric_difference(s1)
{4, 5}
  • set1.symmetric_difference_update(set2):取set1和set2差集,set1为差集结果
>>> s1
{1, 2, 3}
>>> s2
{1, 2, 3, 4, 5}
>>> s1.symmetric_difference_update(s2)
>>> s1
{4, 5}
>>> s2
{1, 2, 3, 4, 5}
  • set1.union(set2):取set1和set2并集,结果可赋值新集合
>>> s1
{11, 12, 13}
>>> s2
{1, 2, 3, 4, 5}
>>> s1.union(s2)
{1, 2, 3, 4, 5, 11, 12, 13}
>>> s1
{11, 12, 13}
>>> s2
{1, 2, 3, 4, 5}
>>> s3 = s1.union(s2)
>>> s3
{1, 2, 3, 4, 5, 11, 12, 13}
  • set1.update(set2):取set1和set2并集;set1为并集结果
>>> s1
{11, 12, 13}
>>> s2
{1, 2, 3, 4, 5}
>>> s1.update(s2)
>>> s1
{1, 2, 3, 4, 5, 11, 12, 13}
>>> s2
{1, 2, 3, 4, 5}

3、常用内置函数

len(set):查看set元素个数