我最近遇到了一个场景,在这个场景中,如果一个集合只包含一个元素,我想要对该元素做一些事情。为了获得元素,我决定采用这种方法:
element = list(myset)[0]
但这并不是很令人满意,因为它创建了一个不必要的列表。这也可以通过迭代来完成,但是迭代似乎也不自然,因为只有一个元素。我错过了什么简单的东西吗?
发布于 2009-10-25 16:05:17
在创建元组和迭代器之间,这几乎是轻而易举的事情,但迭代以微弱优势取胜……
$ 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))
,这对我来说似乎更好(在Python3.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))
似乎是最好的。
发布于 2017-04-19 12:25:07
我建议:
element = myset.pop()
发布于 2009-10-25 07:59:06
您可以使用效率更高的element = tuple(myset)[0]
,或者,您可以执行以下操作
element = iter(myset).next()
我猜构造迭代器比构造元组/列表更有效。
https://stackoverflow.com/questions/1619514
复制相似问题