我最近遇到过一个场景,如果一个集合只包含一个元素,我想对该元素做一些事情。为了得到这个元素,我决定采用这种方法:

element = list(myset)[0]

但这不是很令人满意,因为它会创建一个不必要的列表。它也可以通过迭代完成,但迭代似乎也不自然,因为只有一个元素。我错过了一些简单的东西吗?

有帮助吗?

解决方案

Tuple拆箱工程。

(element,) = myset

(顺便说一句,python-dev已经探索但拒绝添加 myset.get()来从一个集合中返回一个任意元素。在这里讨论,Guido van Rossum回答 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的集合。 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()

我想构造一个迭代器比构造一个元组/列表更有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top