我最近遇到了一个场景,如果一个集合只包含一个元素,我想对该元素做些事情。为了获得元素,我决定采用以下方法:
element = list(myset)[0]
但这不是很令人满意,因为它创建了不必要的列表。也可以通过迭代来完成,但是迭代似乎也不自然,因为只有一个元素。我是否缺少简单的东西?
Answers:
element ,= myset
[element] = myset
next(iter(myset))
表达式的优点是无需特殊分配即可使用,因此您可以将其作为参数传递给函数。
在制作元组和制作迭代器之间,这几乎是一次洗礼,但迭代会赢得成功……:
$ 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))
,这对我来说似乎更可取(并且在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项的集合,元组会变慢,迭代器不会:
$ 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))
一般情况,打开包装似乎是最好的。
python
系统上是Python 2.5,因此当我按键盘绑定打开python控制台时会出现什么情况。
next(..)
了Python 2.6中提供的功能,因此我现在更好地理解了您的观点!那是好消息。