首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从python中的单成员集合中提取成员?

如何从python中的单成员集合中提取成员?
EN

Stack Overflow用户
提问于 2009-10-25 07:41:51
回答 4查看 32.6K关注 0票数 85

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

代码语言:javascript
复制
element = list(myset)[0]

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

EN

回答 4

Stack Overflow用户

发布于 2009-10-25 16:05:17

在创建元组和迭代器之间,这几乎是轻而易举的事情,但迭代以微弱优势取胜……

代码语言:javascript
复制
$ 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)),这对我来说似乎更好(在Python3.1中也可以使用)。

然而,解包在这两种情况下都能轻松取胜:

代码语言:javascript
复制
$ 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不会:

代码语言:javascript
复制
$ 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))似乎是最好的。

票数 28
EN

Stack Overflow用户

发布于 2017-04-19 12:25:07

我建议:

代码语言:javascript
复制
element = myset.pop()
票数 13
EN

Stack Overflow用户

发布于 2009-10-25 07:59:06

您可以使用效率更高的element = tuple(myset)[0],或者,您可以执行以下操作

代码语言:javascript
复制
element = iter(myset).next()

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1619514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档