我最近遇到一个场景,如果一个集合只包含一个元素,我想对那个元素做一些事情。为了获得元素,我选择了这种方法:
element = list(myset)[0]
但这不是很令人满意,因为它创建了一个不必要的列表。它也可以通过迭代来完成,但迭代似乎也不自然,因为只有一个元素。我错过了一些简单的东西吗?
原文由 recursive 发布,翻译遵循 CC BY-SA 4.0 许可协议
我最近遇到一个场景,如果一个集合只包含一个元素,我想对那个元素做一些事情。为了获得元素,我选择了这种方法:
element = list(myset)[0]
但这不是很令人满意,因为它创建了一个不必要的列表。它也可以通过迭代来完成,但迭代似乎也不自然,因为只有一个元素。我错过了一些简单的东西吗?
原文由 recursive 发布,翻译遵循 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 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答893 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
元组解包工作。
(顺便说一句,python-dev 已经探索但拒绝添加
myset.get()
以返回集合中的任意元素。 讨论在这里,Guido van Rossum 回答 1 和 2。 )我个人最喜欢获取任意元素的方法是(当你有一个未知数时,但如果你只有一个也可以):
1 :在 Python 2.5 及之前,你必须使用
iter(myset).next()