set 的内部结构和 dict 很像, 唯一区别是不存储 value, 因此, 判断一个元素是否在 set 中速度很快.
set 存储的元素和 dict 的 key 类似, 必须是不变对象, 因此, 任何可变对象是不能放入 set 中的.
最后, set 存储的元素也是没有顺序的.
set 的这些特点, 可以应用在哪些地方呢?
星期一到星期日可以用字符串'MON', 'TUE', ... 'SUN'表示.
假设我们让用户输入星期一至星期日的某天, 如何判断用户的输入是否是一个有效的星期呢?
可以用 if 语句判断, 但这样做非常繁琐:
- x = '???' # 用户输入的字符串
- if x!= 'MON' and x!= 'TUE' and x!= 'WED' ... and x!= 'SUN':
- print 'input error'
- else:
- print 'input ok'
注意: if 语句中的... 表示没有列出的其它星期名称, 测试时, 请输入完整.
如果事先创建好一个 set, 包含'MON' ~ 'SUN':
weekdays = set(['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])
再判断输入是否有效, 只需要判断该字符串是否在 set 中:
- x = '???' # 用户输入的字符串
- if x in weekdays:
- print 'input ok'
- else:
- print 'input error'
这样一来, 代码就简单多了.
遍历 set
由于 set 也是一个集合, 所以, 遍历 set 和遍历 list 类似, 都可以通过 for 循环实现.
直接使用 for 循环可以遍历 set 的元素:
- >>> s = set(['Adam', 'Lisa', 'Bart'])
- >>> for name in s:
- ... print name
- ...
- Lisa
- Adam
- Bart
注意: 观察 for 循环在遍历 set 时, 元素的顺序和 list 的顺序很可能是不同的, 而且不同的机器上运行的结果也可能不同.
任务
请用 for 循环遍历如下的 set, 打印出 name: score 来.
s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
代码
- s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)])
- for x in s:
- print(x[0],':',x[1])
运行结果
- Adam : 95
- Bart : 59
- Lisa : 85
更新 set
由于 set 存储的是一组不重复的无序元素, 因此, 更新 set 主要做两件事:
一是把新的元素添加到 set 中, 二是把已有元素从 set 中删除.
添加元素时, 用 set 的 add() 方法:
- >>> s = set([1, 2, 3])
- >>> s.add(4)
- >>> print s
- set([1, 2, 3, 4])
如果添加的元素已经存在于 set 中, add() 不会报错, 但是不会加进去了:
- >>> s = set([1, 2, 3])
- >>> s.add(3)
- >>> print s
- set([1, 2, 3])
删除 set 中的元素时, 用 set 的 remove() 方法:
- >>> s = set([1, 2, 3, 4])
- >>> s.remove(4)
- >>> print s
- set([1, 2, 3])
如果删除的元素不存在 set 中, remove() 会报错:
- >>> s = set([1, 2, 3])
- >>> s.remove(4)
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- KeyError: 4
所以用 add() 可以直接添加, 而 remove() 前需要判断.
来源: http://www.bubuko.com/infodetail-3408709.html