python入门四(Dict和Set类型)【4-2 python中的Set】

4-2 python中的Set

 

Python中什么是set

 

dict的作用是建立一组 key 和一组 value 的映射关系,dict的key是不能重复的。

有的时候,我们只想要 dict 的 key,不关心 key 对应的 value,目的就是保证这个集合的元素不会重复,这时,set就派上用场了。

set 持有一系列元素,这一点和 list 很像,但是set的元素没有重复,而且是无序的,这点和 dict 的 key很像。

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

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

可以查看 set 的内容:

1 >>> print s
2 set(['A', 'C', 'B'])

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

 

Python之 访问set

由于set存储的是无序集合,所以我们没法通过索引来访问

访问 set中的某个元素实际上就是判断一个元素是否在set中。

例如,存储了班里同学名字的set:

1 >>> s = set(['Adam', 'Lisa', 'Bart', 'Paul'])

我们可以用 in 操作符判断

Bart是该班的同学吗?

1 >>> 'Bart' in s
2 True

注意:大小写不同会被认为是不同的元素

Python之 set的特点

set的内部结构和dict很像,唯一区别是不存储value,因此,判断一个元素是否在set中速度很快

set存储的元素和dict的key类似,必须是不变对象,因此,任何可变对象是不能放入set中的。

最后,set存储的元素也是没有顺序的。

set的这些特点,可以应用在哪些地方呢?

星期一到星期日可以用字符串'MON', 'TUE', ... 'SUN'表示。

假设我们让用户输入星期一至星期日的某天,如何判断用户的输入是否是一个有效的星期呢?

可以用 if 语句判断,但这样做非常繁琐:

1 x = '???' # 用户输入的字符串
2 if x!= 'MON' and x!= 'TUE' and x!= 'WED' ... and x!= 'SUN':
3     print 'input error'
4 else:
5     print 'input ok'

如果事先创建好一个set,包含'MON' ~ 'SUN':

1 weekdays = set(['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])

再判断输入是否有效,只需要判断该字符串是否在set中:

1 x = '???' # 用户输入的字符串
2 if x in weekdays:
3     print 'input ok'
4 else:
5     print 'input error'

任务

月份也可以用set表示,请设计一个set并判断用户输入的月份是否有效。

月份可以用字符串'Jan', 'Feb', ...表示。

 1 months = set(['Jan','Feb','Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])
 2 x1 = 'Feb'
 3 x2 = 'Sun'
 4 
 5 if x1 in months:
 6     print 'x1: ok'
 7 else:
 8     print 'x1: error'
 9 
10 if x2 in months:
11     print 'x2: ok'
12 else:
13     print 'x2: error'

Python之 遍历set

由于 set 也是一个集合,所以,遍历 set 和遍历 list 类似,都可以通过 for 循环实现。

直接使用 for 循环可以遍历 set 的元素:

1 >>> s = set(['Adam', 'Lisa', 'Bart'])
2 >>> for name in s:
3 ...     print name
4 ... 
5 Lisa
6 Adam
7 Bart

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

任务

请用 for 循环遍历如下的set,打印出 name: score 来。

1 s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])

注意到set的元素是tuple,因此 for 循环的变量被依次赋值为tuple。

1 s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
2 for x in s:
3     print x[0] + ':', x[1]#把每个元组赋给x,访问元组的方法与list相同,加索引值即可

Python之 更新set

由于set存储的是一组不重复的无序元素,因此,更新set主要做两件事:

一是把新的元素添加到set中,二是把已有元素从set中删除

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

>>> s = set([1, 2, 3])
>>> s.add(4)
>>> print s
set([1, 2, 3, 4])

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

1 >>> s = set([1, 2, 3, 4])
2 >>> s.remove(4)
3 >>> print s
4 set([1, 2, 3])

任务

针对下面的set,给定一个list,对list中的每一个元素,如果在set中,就将其删除,如果不在set中,就添加进去。

s = set(['Adam', 'Lisa', 'Paul'])
L = ['Adam', 'Lisa', 'Bart', 'Paul']
1 s = set(['Adam', 'Lisa', 'Paul'])
2 L = ['Adam', 'Lisa', 'Bart', 'Paul']
3 for name in L:
4     if name in s:
5         s.remove(name)
6     else:
7         s.add(name)
8     
9 print s

 

posted on 2019-09-26 10:10  ucas_python  阅读(181)  评论(0编辑  收藏  举报