我最近遇到了一个场景,如果一个集合只包含一个元素,我想用该元素做一些事情.为了得到这个元素,我决定采用这种方法:
element = list(myset)[0]
Run Code Online (Sandbox Code Playgroud)
但这并不是很令人满意,因为它会创建一个不必要的列表.它也可以通过迭代完成,但迭代似乎也不自然,因为只有一个元素.我错过了一些简单的事吗?
u0b*_*6ae 86
元组拆包工作.
(element,) = myset
Run Code Online (Sandbox Code Playgroud)
(顺便说一句,python-dev已经探索过但拒绝了myset.get()从一组中返回任意元素的补充.在这里讨论,Guido van Rossum回答1和2.)
我个人最喜欢获得一个任意元素(当你有一个未知的数字,但如果你只有一个,也可以工作):
element = next(iter(myset)) ¹
Run Code Online (Sandbox Code Playgroud)
1:在Python 2.5和之前,你必须使用iter(myset).next()
Ale*_*lli 21
在制作元组和制作迭代器之间,它几乎是一个洗,但迭代赢得了一个鼻子......:
$ 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
Run Code Online (Sandbox Code Playgroud)
不确定为什么所有答案都使用旧语法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
Run Code Online (Sandbox Code Playgroud)
这当然是针对单项集(其中后一种形式,正如其他人提到的那样,如果您"知道"只有一个项目实际上有几个,那么它具有快速失败的优势).对于具有任意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
Run Code Online (Sandbox Code Playgroud)
因此,对于单身案件进行拆包,next(iter(x))对于一般情况,看起来最好.
Cra*_*een 13
我认为kaizer.se的答案很棒.但是如果你的集合可能包含多个元素,并且你想要一个不那么随意的元素,你可能想要使用min或max.例如:
element = min(myset)
Run Code Online (Sandbox Code Playgroud)
要么:
element = max(myset)
Run Code Online (Sandbox Code Playgroud)
(不要使用sorted,因为这会产生不必要的开销.)
我建议:
element = myset.pop()
Run Code Online (Sandbox Code Playgroud)