Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5119392
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2016-03-28 18:19:59


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

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

  3.  

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

  5. >>> x = set('spam')
  6. >>> y = set(['h','a','m'])
  7. >>> x, y
  8. (set(['a', 'p', 's', 'm']), set(['a', 'h', 'm']))

  9. 再来些小应用。

  10. >>> x & y # 交集
  11. set(['a', 'm'])

  12. >>> x | y # 并集
  13. set(['a', 'p', 's', 'h', 'm'])

  14. >>> x - y # 差集
  15. set(['p', 's'])

  16. 记得以前个网友提问怎么去除海量列表里重复元素,用hash来解决也行,只不过感觉在性能上不是很高,用set解决还是很不错的,示例如下:

  17. >>> a = [11,22,33,44,11,22]
  18. >>> b = set(a)
  19. >>> b
  20. set([33, 11, 44, 22])
  21. >>> c = [i for i in b]
  22. >>> c
  23. [33, 11, 44, 22]

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

  25. 1.8 集合
  26.  
  27. 集合用于包含一组无序的对象。要创建集合,可使用set()函数并像下面这样提供一系列的项:

  28.  

  29. s = set([3,5,9,10]) #创建一个数值集合

  30. t = set("Hello") #创建一个唯一字符的集合

  31.  

  32. 与列表和元组不同,集合是无序的,也无法通过数字进行索引。此外,集合中的元素不能重复。例如,如果检查前面代码中t集合的值,结果会是:

  33.  

  34. >>> t

  35. set(['H', 'e', 'l', 'o'])

  36.  

  37. 注意只出现了一个'l'

  38. 集合支持一系列标准操作,包括并集、交集、差集和对称差集,例如:

  39.  

  40. a = t | s # t 和 s的并集

  41. b = t & s # t 和 s的交集

  42. c = t – s # 求差集(项在t中,但不在s中)

  43. d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)

  44.  

  45. 基本操作:

  46. t.add('x') # 添加一项

  47. s.update([10,37,42]) # 在s中添加多项

  48.  

  49. 使用remove()可以删除一项:

  50. t.remove('H')

  51.  

  52. len(s)
  53. set 的长度

  54. x in s
  55. 测试 x 是否是 s 的成员

  56. x not in s
  57. 测试 x 是否不是 s 的成员

  58. s.issubset(t)
  59. s <= t
  60. 测试是否 s 中的每一个元素都在 t 中

  61. s.issuperset(t)
  62. s >= t
  63. 测试是否 t 中的每一个元素都在 s 中

  64. s.union(t)
  65. s | t
  66. 返回一个新的 set 包含 s 和 t 中的每一个元素

  67. s.intersection(t)
  68. s & t
  69. 返回一个新的 set 包含 s 和 t 中的公共元素

  70. s.difference(t)
  71. s - t
  72. 返回一个新的 set 包含 s 中有但是 t 中没有的元素

  73. s.symmetric_difference(t)
  74. s ^ t
  75. 返回一个新的 set 包含 s 和 t 中不重复的元素

  76. s.copy()
  77. 返回 set “s”的一个浅复制


  78. 请注意:union(), intersection(), difference() 和 symmetric_difference() 的非运算符(non-operator,就是形如 s.union()这样的)版本将会接受任何 iterable 作为参数。相反,它们的运算符版本(operator based counterparts)要求参数必须是 sets。这样可以避免潜在的错误,如:为了更可读而使用 set('abc') & 'cbs' 来替代 set('abc').intersection('cbs')。从 2.3.1 版本中做的更改:以前所有参数都必须是 sets。

  79. 另外,Set 和 ImmutableSet 两者都支持 set 与 set 之间的比较。两个 sets 在也只有在这种情况下是相等的:每一个 set 中的元素都是另一个中的元素(二者互为subset)。一个 set 比另一个 set 小,只有在第一个 set 是第二个 set 的 subset 时(是一个 subset,但是并不相等)。一个 set 比另一个 set 打,只有在第一个 set 是第二个 set 的 superset 时(是一个 superset,但是并不相等)。

  80. 子 set 和相等比较并不产生完整的排序功能。例如:任意两个 sets 都不相等也不互为子 set,因此以下的运算都会返回 False:a<b, a==b, 或者a>b。因此,sets 不提供 __cmp__ 方法。

  81. 因为 sets 只定义了部分排序功能(subset 关系),list.sort() 方法的输出对于 sets 的列表没有定义。


  82. 运算符
  83.    运算结果

  84. hash(s)
  85.    返回 s 的 hash 值


  86. 下面这个表列出了对于 Set 可用二对于 ImmutableSet 不可用的运算:

  87. 运算符(voperator)
  88. 等价于
  89. 运算结果

  90. s.update(t)
  91. s |= t
  92. 返回增加了 set “t”中元素后的 set “s”

  93. s.intersection_update(t)
  94. s &= t
  95. 返回只保留含有 set “t”中元素的 set “s”

  96. s.difference_update(t)
  97. s -= t
  98. 返回删除了 set “t”中含有的元素后的 set “s”

  99. s.symmetric_difference_update(t)
  100. s ^= t
  101. 返回含有 set “t”或者 set “s”中有而不是两者都有的元素的 set “s”

  102. s.add(x)

  103. 向 set “s”中增加元素 x

  104. s.remove(x)

  105. 从 set “s”中删除元素 x, 如果不存在则引发 KeyError

  106. s.discard(x)

  107. 如果在 set “s”中存在元素 x, 则删除

  108. s.pop()

  109. 删除并且返回 set “s”中的一个不确定的元素, 如果为空则引发 KeyError

  110. s.clear()

  111. 删除 set “s”中的所有元素


  112. 请注意:非运算符版本的 update(), intersection_update(), difference_update()和symmetric_difference_update()将会接受任意 iterable 作为参数。从 2.3.1 版本做的更改:以前所有参数都必须是 sets。

  113. 还请注意:这个模块还包含一个 union_update() 方法,它是 update() 方法的一个别名。包含这个方法是为了向后兼容。程序员们应该多使用 update() 方法,因为这个方法也被内置的 set() 和 frozenset() 类型支持。


原文链接
阅读(1578) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~