【Python】Python之Set类型

紧跟着前面博文的 dirt 类型,这次我们来讲讲 Python 中与 dirt 类型有相似之处的 set 类型。接下来我们开始正文。

Python之什么是 set 类型

根据之前博文内容,我们知道 dict 的作用是建立一组 key 和一组 value 的映射关系,dict 的 key 是不能重复的。
有的时候,我们只想要 dict 的 key,不关心 key 对应的 value,目的就是保证这个集合的元素不会重复,这时 set 就派上用场了。
set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的,这点和 dict 的 key很像。

创建 set 的方式是调用 set() 并传入一个 list,list的元素将作为set的元素:

s = set(['A', 'B', 'C'])
print( s )

我们可以查看 set 的输出内容:

python set是否 包含某个元素 python中的set类型_字符串


值得注意的是:上述打印的形式类似 list, 但它不是 list,仔细看还可以发现,打印的顺序和原始 list 的顺序有可能是不同的,因为set内部存储的元素是无序的。

因为 set 不能包含重复的元素,所以当我们传入包含重复元素的 list 就会出现如下的结果:

s = set(['a', 'p', 'p', 'l','e'])
print( s )
print(len( s ))

测试:

python set是否 包含某个元素 python中的set类型_字符串_02


结果显示,set 会自动去掉重复的元素,原来的list有5个元素,但set只有4个元素。

Python之 访问 set 类型

由于set存储的是无序集合,所以我们没法通过索引来访问,所以访问 set 中的某个元素实际上就是判断一个元素是否在set中。

假设存储了班里同学名字的 set ,如下:

s = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
print( s )

我们可以使用 in 操作符来进行相应的判断正误,最后会输出 bool 值:

s = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
print( s )
print( 'Paul' in s )
print( 'Lisa' in s )
print( 'Ned' in s )
print('paul' in s )
print( 'ned' in s )

测试如下:

python set是否 包含某个元素 python中的set类型_set类型_03


要注意:英文字母的大小写很重要,‘Paul’ 和 ‘paul’ 或是 ‘Ned’ 和 ‘ned’ 被认为是两个不同的元素。

Python之 set 类型的特点

set的内部结构和dict很像,唯一区别是不存储value,因此判断一个元素是否在 set 中速度很快;set存储的元素和 dict 的 key 类似,必须是不变对象,因此任何可变对象是不能放入set中的。

同时 set 存储的元素也是没有顺序的。

set 的这些特点,应用到我们日常的生活中其实也是挺方便的。
我们举一个贴近于生活且比较简单的例子:
假设我们让用户输入星期一至星期日的某天,如何判断用户的输入是否是一个有效的星期嘞?
其实我们可以用我们之前学的 if 语句进行判断,但这样做十分繁琐:

x = input()
if (x!= 'MON' and x!= 'TUE' and x!= 'WED' and x!= 'THU' and x!= 'FRI' and x!= 'SAT' and x!= 'SUN'):
    print ('input error')
else:
    print ('input ok')

从上文代码块中,我们可以很明显的感觉到使用 if 语句的繁琐,但如果我们使用今天学的 set 类型,事先创建好一个set,包含’MON’ ~ ‘SUN’,然后再判断输入是否有效,只需要判断该字符串是否在 set中就行了,这样一来代码就简单多了:

weekdays = set(['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])
x= input()
if x in weekdays:
    print ('input ok')
else:
    print ('input error')

测试结果如下:

python set是否 包含某个元素 python中的set类型_Python_04

Python之 遍历set类型

由于 set 也是一个集合,所以遍历 set 和遍历 list 类似,都可以通过 for 循环实现。
直接使用 for 循环可以遍历 set 的元素:

s = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
for name in s:
   print ( name )

测试结果:

python set是否 包含某个元素 python中的set类型_Python_05


注意: 观察 for 循环在遍历 set 时,元素的顺序和 list 的顺序很可能是不同的,而且不同的机器上运行的结果也可能不同。

接下来,我们来看一个例题
请用 for 循环遍历如下的set,打印出 name : score .

s = set([('Adam', 92), ('Lisa', 85), ('Bart', 66),('Paul',88),('Ned',99)])

题目解析
注意到set的元素是tuple,因此 for 循环的变量被依次赋值为tuple。
代码参考:

s = set([('Adam', 92), ('Lisa', 85), ('Bart', 66),('Paul',88),('Ned',99)])
for x in s:
    print (x[0] , ':' , x[1])

测试结果:

python set是否 包含某个元素 python中的set类型_Python_06


在这里我们要注意一个点,就是倘若我们修改原题目题设为:请用 for 循环遍历如下的set,打印出 name: score .(自己看会发现,name后面少一个空格space

那我们的代码也需要做出适时的调整:

s = set([('Adam', 92), ('Lisa', 85), ('Bart', 66),('Paul',88),('Ned',99)])
for x in s:
    print (x[0] + ':' , x[1])

测试结果:

python set是否 包含某个元素 python中的set类型_set类型_07


于此,该题解答到此结束。

Python之 更新set

由于set存储的是一组不重复的无序元素,因此更新set主要做两件事:
一是把新的元素添加到 set 中,二是把已有元素从 set 中删除。

添加元素时用 set 的 add( ) 方法:

s = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
s.add('Amy')
print( s )

测试结果:

python set是否 包含某个元素 python中的set类型_字符串_08


如果添加的元素已经存在于 set 中,add( ) 不会报错但是不会加进去了:

s = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
s.add('Ned')
print( s )

测试结果:

python set是否 包含某个元素 python中的set类型_python set是否 包含某个元素_09


删除 set 中的元素时可以用 set 的 remove( ) 方法:

s = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
s.remove('Ned')
print( s )

值得注意的是,如果删除的元素不存在 set 中,remove( ) 会报错:

s = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
s.remove('Amy')
print( s )

测试结果:

python set是否 包含某个元素 python中的set类型_操作符_10


因此,在用 add( ) 可以直接添加无须担心,而使用 remove( ) 前需要判断。

下面我们再来看一个简单的例题
针对下面的set,给定一个list,对list中的每一个元素,如果在set中,就将其删除,如果不在set中,就添加进去。

s = set(['Adam', 'Lisa', 'Paul'])
l = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])

本题解析
在本题中,如果要判断元素是否在 set 中就要使用 in 操作符了。
代码参考如下:

s = set(['Adam', 'Lisa', 'Paul'])
l = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
for name in l:
    if name in s:
        s.remove(name)
    else:
        s.add(name)
print ( s )

测试结果:

python set是否 包含某个元素 python中的set类型_Python_11


尾语:其实也没什么,就是简单的 set 类型基础,讲完了然后灵活运用,熟能生巧。

同时接近十二月,一九年和二零年要换班了,考试月也马不停蹄,大家都要加油了!!!