【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 的输出内容:
值得注意的是:上述打印的形式类似 list, 但它不是 list,仔细看还可以发现,打印的顺序和原始 list 的顺序有可能是不同的,因为set内部存储的元素是无序的。
因为 set 不能包含重复的元素,所以当我们传入包含重复元素的 list 就会出现如下的结果:
s = set(['a', 'p', 'p', 'l','e'])
print( s )
print(len( s ))
测试:
结果显示,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 )
测试如下:
要注意:英文字母的大小写很重要,‘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类型
由于 set 也是一个集合,所以遍历 set 和遍历 list 类似,都可以通过 for 循环实现。
直接使用 for 循环可以遍历 set 的元素:
s = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
for name in s:
print ( name )
测试结果:
注意: 观察 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])
测试结果:
在这里我们要注意一个点,就是倘若我们修改原题目题设为:请用 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
由于set存储的是一组不重复的无序元素,因此更新set主要做两件事:
一是把新的元素添加到 set 中,二是把已有元素从 set 中删除。
添加元素时用 set 的 add( ) 方法:
s = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
s.add('Amy')
print( s )
测试结果:
如果添加的元素已经存在于 set 中,add( ) 不会报错但是不会加进去了:
s = set(['Adam', 'Lisa', 'Bart', 'Paul','Ned','Lucy'])
s.add('Ned')
print( s )
测试结果:
删除 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 )
测试结果:
因此,在用 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 )
测试结果:
尾语:其实也没什么,就是简单的 set 类型基础,讲完了然后灵活运用,熟能生巧。
同时接近十二月,一九年和二零年要换班了,考试月也马不停蹄,大家都要加油了!!!