如何从Python中的单一成员集提取成员?

我最近遇到了一个情景,如果一个集合只包含一个元素,我想用这个元素做一些事情。 为了得到这个元素,我决定了这个方法:

element = list(myset)[0] 

但这并不令人满意,因为它创造了一个不必要的清单。 也可以用迭代来完成,但迭代似乎也不自然,因为只有一个元素。 我错过了一些简单的东西吗

元组解包工作。

 (element,) = myset 

(顺便说一下,python-dev已经探索过,但是拒绝了myset.get()返回一个集合中的任意元素的讨论,在这里讨论 Guido van Rossum回答1和2 )

我个人最喜欢获取任意元素(当你有一个未知的数字,但也适用,如果你只有一个):

 element = next(iter(myset)) ¹ 

1 :在Python 2.5之前,你必须使用iter(myset).next()

在创build一个元组和迭代器之间,它几乎是一个洗涤,但迭代赢得了一个鼻子…:

 $ python2.6 -mtimeit -s'x=set([1])' 'a=tuple(x)[0]' 1000000 loops, best of 3: 0.465 usec per loop $ python2.6 -mtimeit -s'x=set([1])' 'a=tuple(x)[0]' 1000000 loops, best of 3: 0.465 usec per loop $ python2.6 -mtimeit -s'x=set([1])' 'a=next(iter(x))' 1000000 loops, best of 3: 0.456 usec per loop $ python2.6 -mtimeit -s'x=set([1])' 'a=next(iter(x))' 1000000 loops, best of 3: 0.456 usec per loop 

不知道为什么所有的答案都使用旧的语法iter(x).next()而不是next(iter(x))的新的next(iter(x)) ,这对我来说似乎更可取(也适用于Python 3.1)。

但是,拆包在两个方面都取得了胜利:

 $ python2.6 -mtimeit -s'x=set([1])' 'a,=x' 10000000 loops, best of 3: 0.174 usec per loop $ python2.6 -mtimeit -s'x=set([1])' 'a,=x' 10000000 loops, best of 3: 0.174 usec per loop 

这当然是用于单项目组(如果其他人提到的话,如果你知道这个组合只有一个项目实际上有几个项目,那么这个组合的优势就是快速失败)。 对于具有任意N> 1个项目的集合,元组变慢,iter不:

 $ python2.6 -mtimeit -s'x=set(range(99))' 'a=next(iter(x))' 1000000 loops, best of 3: 0.417 usec per loop $ python2.6 -mtimeit -s'x=set(range(99))' 'a=tuple(x)[0]' 100000 loops, best of 3: 3.12 usec per loop 

所以,对于单例情况,以及next(iter(x)) ,对于一般情况来说,看起来是最好的。

我认为kaiser.se的答案很好。 但是如果你的集合可能包含多个元素,并且你想要一个不那么随意的元素,你可能需要使用min或者max 。 例如:

 element = min(myset) 

要么:

 element = max(myset) 

(不要使用sorted ,因为它有这种用法不必要的开销。)

你可以使用element = tuple(myset)[0]这是更有效率,或者,你可以做类似的事情

 element = iter(myset).next() 

我猜构造一个迭代器比构造一个元组/列表更有效率。

我build议:

 element = myset.pop()