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

rec*_*ive 58 python set

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

element = list(myset)[0]
Run Code Online (Sandbox Code Playgroud)

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

u0b*_*6ae 86

元组拆包工作.

(element,) = myset
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,python-dev已经探索过但拒绝了myset.get()从一组中返回任意元素的补充.在这里讨论,Guido van Rossum回答1和2.)

我个人最喜欢获得一个任意元素(当你有一个未知的数字,但如果你只有一个,也可以工作):

element = next(iter(myset)) ¹
Run Code Online (Sandbox Code Playgroud)

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

  • 非常好!我喜欢如果元素的数量不是1则失败. (8认同)
  • 或者,如果你想假装Python有一个适当的操作员(你的同事会讨厌你):`element,= myset` (6认同)
  • 我不是那个逗号的粉丝告诉python它是一个元组.怎么样```[element] = myset``` (3认同)
  • `next(iter(myset))`表达式的优点是可以在没有特殊赋值的情况下使用,因此您可以将它作为参数传递给函数. (3认同)
  • 建议改进:强调第一个对于非单例集会失败。 (2认同)

Ale*_*lli 21

在制作元组和制作迭代器之间,它几乎是一个洗,但迭代赢得了一个鼻子......:

$ 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
Run Code Online (Sandbox Code Playgroud)

不确定为什么所有答案都使用旧语法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
Run Code Online (Sandbox Code Playgroud)

这当然是针对单项集(其中后一种形式,正如其他人提到的那样,如果您"知道"只有一个项目实际上有几个,那么它具有快速失败的优势).对于具有任意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
Run Code Online (Sandbox Code Playgroud)

因此,对于单身案件进行拆包,next(iter(x))对于一般情况,看起来最好.


Cra*_*een 13

我认为kaizer.se的答案很棒.但是如果你的集合可能包含多个元素,并且你想要一个不那么随意的元素,你可能想要使用min或max.例如:

element = min(myset)
Run Code Online (Sandbox Code Playgroud)

要么:

element = max(myset)
Run Code Online (Sandbox Code Playgroud)

(不要使用sorted,因为这会产生不必要的开销.)


Hel*_*mut 5

我建议:

element = myset.pop()
Run Code Online (Sandbox Code Playgroud)

  • 这可能适用于某些情况,但它会改变集合。 (3认同)
  • @Astrid:对于某些用例,是的。对于其他人,没有。 (2认同)