【问题标题】:Access the sole element of a set访问集合的唯一元素
【发布时间】:2014-01-04 17:01:01
【问题描述】:

我在 Python 中有一个 set,我根据条件从其中一个一个地删除元素。当集合只剩下 1 个元素时,我需要返回该元素。如何从集合中访问此元素?

一个简化的例子:

S = set(range(5))
for i in range(4):
    S = S - {i}
# now S has only 1 element: 4
return ? # how should I access this element
# a lame way is the following
# for e in S:
#    return S

【问题讨论】:

  • 如果你想从一个集合中移除一个项目,S.remove(i) 更快。 (注意S.remove(i) 修改了S,而S = S - {i} 用新的集合替换了它。)

标签: python set


【解决方案1】:
  1. 集合是没有重复元素的无序集合。

  2. 基本用途包括成员资格测试和消除重复条目。

  3. Set 对象还支持联合、交集、差分和对称差分等数学运算。

  4. 要创建一个空集,你必须使用 set(),而不是 {}; 后者创建一个空字典,这是我们在下一节中讨论的数据结构。

  5. 按升序/降序对集合进行排序 -> 返回已排序元素的列表,不更改集合

    sorted(basket) # 升序 sorted(basket, reverse=True) # 降序排列

从集合或排序集合中获取 x 元素

list(basket)[x] or sorted(basket)[x] 

注意:set 是无序集合,所以你可以使用下面的代码从有序集合中获取 x 元素

【讨论】:

    【解决方案2】:

    一种方法是:value=min(set(['a','b','c')) 产生 'a'。显然你可以改用max

    【讨论】:

      【解决方案3】:

      我会使用:

      e = next(iter(S))
      

      这是非破坏性的,即使集合中有多个元素也可以使用。更好的是,它可以选择提供默认值e = next(iter(S), default)

      你也可以使用解包:

      [e] = S
      

      解包技术可能是最快的方法,它包括错误检查以确保集合只有一个成员。缺点是看起来很奇怪。

      【讨论】:

      • 我计时了,拆包似乎比 iter 方法快 2.5 倍。 min/max 也比 iter 快 2 倍。
      • 解包赋值方式也不错。
      • 或者如果你不喜欢结尾的逗号,方括号也可以:[e] = S
      • 拆包看起来有点奇怪,但在选项中似乎是最不坏的。
      • +1 以提高可读性和传达意图。这是我的选择,除非性能被证明是至关重要的。
      【解决方案4】:

      抱歉,聚会迟到了。要访问集合中的元素,您始终可以将集合转换为列表,然后您可以使用索引返回所需的值。

      在你的例子中:

      return list(S)[0]
      

      【讨论】:

      【解决方案5】:

      您可以使用star operation 将最后一个元素分配给变量。

      >>> a={"fatih"}
      >>> b=str(*a)
      >>> b
      'fatih'
      

      现在变量b 有一个string object

      如果唯一的元素是一个数字,你可以使用int():

      >>> a={1}
      >>> c=int(*a)
      >>> c
      1
      

      【讨论】:

        【解决方案6】:

        使用set.pop:

        >>> {1}.pop()
        1
        >>>
        

        在你的情况下,它会是:

        return S.pop()
        

        但是请注意,这将从集合中移除该项目。如果不希望这样,可以使用min|max

        return min(S) # 'max' would also work here
        

        演示:

        >>> S = {1}
        >>> min(S)
        1
        >>> S
        set([1])
        >>> max(S)
        1
        >>> S
        set([1])
        >>> 
        

        【讨论】:

        • +1,不知道set.pop 虽然我想这并不奇怪。在这里我会做next(iter(S))
        • 仅当您可以删除该项目时。否则,for 循环或next(iter(S)) 效果更好。
        • 不记录,我倾向于使用min(S),虽然我官方支持(tm) next(iter(S))
        • @DSM - 实际上,我比其他方法更喜欢这种方法。它更短。
        • 从代码文档的角度来看,max()min() 只是.. 错误的。对于毫无戒心的代码读者来说太令人惊讶了。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 2018-01-08
        相关资源
        最近更新 更多