我最近遇到的,其中,如果一组只包含一个单一的元素,我想做的事与该元素的东西的情况。 要获得元素,我看中了这个办法:
element = list(myset)[0]
但是,这不是非常令人满意,因为它创造了一个不必要的名单。 它也可以用迭代完成,但迭代似乎不自然为好,因为只有一个单一的元素。 我失去了简单的东西?
我最近遇到的,其中,如果一组只包含一个单一的元素,我想做的事与该元素的东西的情况。 要获得元素,我看中了这个办法:
element = list(myset)[0]
但是,这不是非常令人满意,因为它创造了一个不必要的名单。 它也可以用迭代完成,但迭代似乎不自然为好,因为只有一个单一的元素。 我失去了简单的东西?
元组拆包作品。
(element,) = myset
(顺便提一下,蟒蛇-dev的探索了,但拒绝加入myset.get()
从一组返回的任意元素。 在这里讨论 ,吉多·范罗苏姆回答1和2 )。
我对得到一个任意元素的个人最喜欢的是(当你有一个未知的数字,但也适用,如果你只有一个):
element = next(iter(myset)) ¹
1:在Python 2.5和之前,你必须使用iter(myset).next()
制作一个元组,使一个迭代器之间,它由鼻子几乎一洗,但迭代胜...:
$ 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项,元组减慢,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
。 例如:
element = min(myset)
要么:
element = max(myset)
(不要使用sorted
,因为有这种用法不必要的开销。)
我建议:
element = myset.pop()
可以使用element = tuple(myset)[0]
其是多一点高效,或者,可以执行类似
element = iter(myset).next()
我想构建一个迭代器比构建一个元组/列表更有效。