如何在python中从单个成员集中提取成员?

2024-10-03 02:46:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近遇到一个场景,如果一个集合只包含一个元素,我想对这个元素做些什么。为了得到元素,我决定采用以下方法:

element = list(myset)[0]

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


Tags: 方法元素列表场景elementlistmyset
3条回答

元组解包工作。

(element,) = myset

(顺便说一下,python dev已经研究过了,但是拒绝添加myset.get()来从集合返回任意元素。Discussion here,Guido van Rossum回答12。)

我个人最喜欢获取任意元素的方法是(当您有一个未知的数字时,但如果只有一个,也可以这样做):

element = next(iter(myset)) ¹

1:在Python 2.5及之前版本中,必须使用iter(myset).next()

我觉得kaizer.se's answer很棒。但是如果您的集合可能包含多个元素,并且您想要一个不是任意的元素,那么您可能需要使用^{}^{}。E、 g.:

element = min(myset)

或:

element = max(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个项的集,元组速度会减慢,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))对于一般情况,解包似乎是最好的。

相关问题 更多 >