- 发现在用python进行机器学习数据挖掘的时候经常用到set,在网上收了一些资料。
-
- http://blog.csdn.net/business122/article/details/7541486
- http://www.cnblogs.com/xiaoit/p/4045547.html
-
- set的内部结构和dict很像,主要区别是不存储value,因此,判断一个元素是否在set中速度很快。
-
set存储的元素和dict的key类似,必须是不变对象,因此,任何可变对象是不能放入set中的。
最后,set存储的元素也是没有顺序的。
-
假设我们让用户输入星期一至星期日的某天,如何判断用户的输入是否是一个有效的星期呢?
-
如果事先创建好一个set,包含'MON' ~ 'SUN':
123456weekdays
=
set
([
'MON'
,
'TUE'
,
'WED'
,
'THU'
,
'FRI'
,
'SAT'
,
'SUN'
])
x
=
'MON'
# 用户输入的字符串
if
x
in
weekdays:
print
(
'input ok'
)
else
:
print
(
'input error'
)
- 下面来点简单的小例子说明把。
-
- >>>
x = set('spam') - >>>
y = set(['h','a','m']) - >>>
x, y - (set(['a',
'p', 's', 'm']), set(['a', 'h', 'm'])) -
- 再来些小应用。
-
- >>>
x & y # 交集 - set(['a',
'm']) -
- >>>
x | y # 并集 - set(['a',
'p', 's', 'h', 'm']) -
- >>>
x - y # 差集 - set(['p',
's']) -
- 记得以前个网友提问怎么去除海量列表里重复元素,用hash来解决也行,只不过感觉在性能上不是很高,用set解决还是很不错的,示例如下:
-
- >>>
a = [11,22,33,44,11,22] - >>>
b = set(a) - >>>
b - set([33,
11, 44, 22]) - >>>
c = [i for i in b] - >>>
c - [33,
11, 44, 22] -
-
-
- 集合支持一系列标准操作,包括并集、交集、差集和对称差集,例如:
-
-
-
- a
= t | s # t 和 s的并集 -
- b
= t & s # t 和 s的交集 -
- c
= t – s # 求差集(项在t中,但不在s中) -
- d
= t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中) -
-
-
- 基本操作:
-
- t.add('x')
# 添加一项 -
- s.update([10,37,42])
# 在s中添加多项 -
- 使用remove()可以删除一项:
-
- t.remove('H')
-
- len(s)
- set
的长度 -
- x
in s - 测试
x 是否是 s 的成员 -
- x
not in s - 测试
x 是否不是 s 的成员
- #子集运算
- >>>
s = set([1,2,3,4,5]) - >>>
t = set([1,2,3]) - >>>
s.issubset(t) #s是否为t的子集,相当于s<=t - False
- >>>
t.issubset(s) #t是否为s的子集,相当于s>=t - True
- >>>
s<=t - False
- >>>
t<=s - True
- >>>
s - False
- >>>
s>t - True
- >>>
s==t - False
- >>>
x = set([1,2,3]) - >>>
x==t #两set是否相等 - True
对比frozenset:
frozenset:元素一经创建,不可增加、删除和修改。
不可变集合frozenset的元素可作为字典的键,但可变集合set就不行了。
还有一点需要注意,不管是set还是frozenset,Python都不支持创建一个整数的集合。
seta=set(1) #错误 setb=set('1')#正确