【问题标题】:Contains of HashSet<Integer> in PythonPython 中包含 HashSet<Integer>
【发布时间】:2014-12-30 16:26:58
【问题描述】:

在 Java 中我们有 HashSet&lt;Integer&gt;,我需要在 Python 中使用类似的结构来使用包含如下:

A = [1, 2, 3]
S = set()
S.add(2)
for x in A:
    if S.contains(x):
        print "Example"

你能帮忙吗?

【问题讨论】:

标签: python contains hashset


【解决方案1】:

只使用一个集合:

>>> l = set()
>>> l.add(1)
>>> l.add(2)
>>> 1 in l
True
>>> 34 in l
False

列表也一样:

>>> ll = [1,2,3]
>>> 2 in ll
True
>>> 23 in ll
False

编辑: 请注意下面@bholagabbar 的评论,in 检查列表和元组的时间复杂度平均为 O(n)(参见 python 文档here),而对于集合,它平均为 O(1)(最坏的情况也是O(n),但非常少见,只有在 __hash__ 实施不佳时才会发生)。

【讨论】:

  • 在列表和元组中搜索元素的复杂度为 O(n),而在集合和字典中为 O(1)。因此更喜欢前者
  • @bholagabbar 因此更喜欢后者*
  • @sloreti:感谢您指出这一点。所以不会让我编辑我的评论。另外,请注意,它将在集合和字典中摊销 O(1)
  • 最坏的情况是 O(n) 当所有哈希值发生冲突时,但这是非常罕见的情况
  • @tttthomasssss,谢谢你的好回答。但我认为 bholagabbar 提到的这一点非常重要。那么您介意编辑您的答案以纳入 bholagabbar 提到的观点吗?
【解决方案2】:

在 Python 中,有一个内置类型 set。 与 Java 中的 hashmap 的主要区别在于 Python set 没有类型, 即,在 Python 中设置 {'2', 2} 是合法的。

开箱即用,类set 没有实现contains() 方法。 我们通常使用 Python 关键字 in 来做你想做的事,即,

A = [1, 2, 3]
S = set()
S.add(2)
for x in A:
  if x in S:
    print("Example")

如果这对您不起作用,您可以调用特殊方法 __contains__(),不鼓励这样做。

A = [1, 2, 3]
S = set()
S.add(2)
for x in A:
  if S.__contains__(x):
    print("Example")

【讨论】:

  • 小更正:在 Python 中设置 {'2', 2} 是 [不] 合法的
猜你喜欢
  • 1970-01-01
  • 2014-07-11
  • 2015-01-30
  • 2012-08-15
  • 2013-08-20
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多