题
我最近遇到过一个场景,如果一个集合只包含一个元素,我想对该元素做一些事情。为了得到这个元素,我决定采用这种方法:
element = list(myset)[0]
但这不是很令人满意,因为它会创建一个不必要的列表。它也可以通过迭代完成,但迭代似乎也不自然,因为只有一个元素。我错过了一些简单的东西吗?
其他提示
在制作元组和制作迭代器之间,它几乎是一个洗,但迭代赢得了一个鼻子......:
$ 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的集合。 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))
似乎是最好的。
我估计 kaizer .se的回答很棒。但是如果您的 集合包含多个元素,并且您想要一个不那么随意的元素,那么您可能希望使用 min
或 max
。 E.g:
element = min(myset)
或:
element = max(myset)
(请勿使用 sorted
,因为这有不必要的开销。)
我建议:
element = myset.pop()
你可以使用 element = tuple(myset)[0]
这样效率更高,或者你可以做类似的事情
element = iter(myset).next()
我想构造一个迭代器比构造一个元组/列表更有效。
不隶属于 StackOverflow