Learn python with socratica [My notes] - part 11- Sets in Python

Lesson 13

在Python中,数据结构形式有很多,包括:Set、List、Tuple和Dictionary。本节详细介绍一下Set,我们先新建一个set集合,用dir()得到它能使用的函数。

1
2
example = set()
dir(example) # the following functions is what 'set()' can use
['__and__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__iand__',
 '__init__',
 '__init_subclass__',
 '__ior__',
 '__isub__',
 '__iter__',
 '__ixor__',
 '__le__',
 '__len__',
 '__lt__',
 '__ne__',
 '__new__',
 '__or__',
 '__rand__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__ror__',
 '__rsub__',
 '__rxor__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__sub__',
 '__subclasshook__',
 '__xor__',
 'add',
 'clear',
 'copy',
 'difference',
 'difference_update',
 'discard',
 'intersection',
 'intersection_update',
 'isdisjoint',
 'issubset',
 'issuperset',
 'pop',
 'remove',
 'symmetric_difference',
 'symmetric_difference_update',
 'union',
 'update']

我们首先尝试给set增加一个元素,从dir中,可以找到具有该功能的add()函数。

1
help(example.add) # get help from API document
Help on built-in function add:

add(...) method of builtins.set instance
    Add an element to a set.

    This has no effect if the element is already present.

从文档我们得知,add()函数可以给set增加一个元素,不管这个元素是否出现过,意思就是说:如果增加的这个元素set里有,不会报错。我们尝试给example增加各种类型的元素:

1
2
3
4
5
6
example.add(42)
example.add(False)
example.add(3.1415926)
example.add('String')

print(example)
{False, 42, 3.1415926, 'String'}

set的每一个成分被称为element(元素),每个元素可以是任意类型的数据。

下面讲一个set与其他数据结构不同的地方:

1
2
example.add(42)
print(example)
{False, 42, 3.1415926, 'String'}

由这个例子可以得到,set在增加元素的时候会做一个交集的操作,增加的元素如果set里有就不加了。我们也可以用len()函数看一下set此时的长度,证明一下:

1
len(example)
4

与增加相对应的是去除,set可以使用remove()进行操作:

1
help(example.remove)
Help on built-in function remove:

remove(...) method of builtins.set instance
    Remove an element from a set; it must be a member.

    If the element is not a member, raise a KeyError.

意思就是说去除set中的一个元素,但是给的变量一定要是set中存在的,否则报错。

1
2
example.remove(42)
len(example)
3
1
example
{3.1415926, False, 'String'}

下面介绍另一个去除元素的函数discard:

1
help(example.discard)
Help on built-in function discard:

discard(...) method of builtins.set instance
    Remove an element from a set if it is a member.

    If the element is not a member, do nothing.

从文档介绍我们可以找出不同,discard函数在遇到给定变量不是set中元素的时候,不会报错。

1
2
example.discard(50) # 50 is not in example
example # piece and quiet, sometimes it is more convenient than remove()
{3.1415926, False, 'String'}

讲到这里,再介绍两个快速建立set和快速清空set的方法:

1
2
3
4
5
6
7
example2 = set([23,34.23,'string2',True])
len(example2)
> 4

example2.clear()
len(example2)
> 0

到此讲完set增加和删除的全部函数,下面讲一下对set并集[union]交集[intersection]的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# Integers 1 - 10

odds = set([1,3,5,7,9])
evens = set([2,4,6,8,10])
primes = set([2,3,5,7])
composites = set([4,6,8,9,10])

odds.union(evens)
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

evens.union(odds)
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

odds # unchanged
{1, 3, 5, 7, 9}

evens # unchanged
{2, 4, 6, 8, 10}

odds.intersection(primes)
{3, 5, 7}

primes.intersection(evens)
{2}

odds.intersection(evens) # 空
set()

以上就是并集交集的操作,那么如何去判断一个变量是否在set中呢,这个在循环中是经常用到的,python中使用的 in 和 not in :

1
2
3
4
5
2 in primes
True

6 not in evens
False

当然,除了以上操作,还有很多需要去发现,用dir()、help() 去探索吧。

Youtube source:
https://www.youtube.com/watch?v=bY6m6_IIN94&list=PLi01XoE8jYohWFPpC17Z-wWhPOSuh8Er-