访问集合的唯一元素

Nik*_*Nik 29 python set

我有一个setPython,我从中根据条件逐个删除元素.当集合只剩下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
Run Code Online (Sandbox Code Playgroud)

iCo*_*dez 27

用途set.pop:

>>> {1}.pop()
1
>>>
Run Code Online (Sandbox Code Playgroud)

在你的情况下,它将是:

return S.pop()
Run Code Online (Sandbox Code Playgroud)

但请注意,这将从集合中删除该项目.如果这是不合需要的,您可以使用min| max:

return min(S) # 'max' would also work here
Run Code Online (Sandbox Code Playgroud)

演示:

>>> S = {1}
>>> min(S)
1
>>> S
set([1])
>>> max(S)
1
>>> S
set([1])
>>> 
Run Code Online (Sandbox Code Playgroud)

  • 从代码文档的角度来看,`max()`或`min()`只是错误的.对于毫无疑问的代码读者来说太令人惊讶了. (8认同)
  • +1,不知道`set.pop`虽然我认为这并不太令人惊讶.在这里,我会完成`next(iter(S))` (2认同)
  • 在记录中,我倾向于使用`min(S)`,尽管我正式支持(tm)`next(iter(S))`. (2认同)

Ray*_*ger 27

我会用:

e = next(iter(S))
Run Code Online (Sandbox Code Playgroud)

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

你也可以使用解包:

[e] = S
Run Code Online (Sandbox Code Playgroud)

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

  • 或者如果你不喜欢尾随的逗号,方括号也会起作用:`[e] = S`. (4认同)
  • 我计时,解包似乎比 iter 方法快 2.5 倍。min/max 也比 iter 快大约 2 倍。 (2认同)
  • 拆包分配方法也很好。 (2认同)