python set和list

来源:互联网 发布:最后的舞者 知乎 编辑:程序博客网 时间:2024/06/05 22:35

python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算.

sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, slicing, 或其它类序列(sequence-like)的操作。

应用场景:
list, 简单的数据集合,可以使用索引;
set,数据只出现一次,只关心数据是否出现, 不关心其位置;

下面来点简单的小例子说明把。

>>> 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]

很酷把,几行就可以搞定。

考虑到range(500, 1500) 调用了1000次(会比较耗时),改成只调用一次的话,时间从28.2msec降到了18.2msec。仍然要(比Set)慢大概150倍。

~$  python -m timeit -n 1000 "range1500=range(500, 1500);[x for x in range(1000) if x in range1500]"

set转成list方法如下:

s = set('12342212')                                                      print s    # set(['1', '3', '2', '4'])                                       l = list(s)                                                                        l.sort()    # 排序                                                             print l    # ['1', '2', '3', '4']   

list转成set方法如下:

l = ['12342212'] s = set(l[0]) print s    # set(['1', '3', '2', '4']) m = ['11','22','33','44','11','22']  print set(m)    # set(['11', '33', '44', '22'])

可见set和lsit可以自由转换,在删除list中多个/海量重复元素时,可以先转换成set,然后再转回list并排序(set没有排序)。此种方法不仅方便且效率较高。

0 0
原创粉丝点击