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

新手上路,请多包涵

我最近遇到一个场景,如果一个集合只包含一个元素,我想对那个元素做一些事情。为了获得元素,我选择了这种方法:

 element = list(myset)[0]

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

原文由 recursive 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 259
2 个回答

元组解包工作。

 (element,) = myset

(顺便说一句,python-dev 已经探索但拒绝添加 myset.get() 以返回集合中的任意元素。 讨论在这里,Guido van Rossum 回答 12。

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

 element = next(iter(myset)) ¹

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

原文由 u0b34a0f6ae 发布,翻译遵循 CC BY-SA 4.0 许可协议

在制作元组和制作迭代器之间,这几乎是一次洗礼,但迭代以微弱优势获胜……:

 $ 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)) 对于一般情况,似乎是最好的。

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题