如何从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()