Como extrair o membro a partir de um único membro do conjunto em python?
Pergunta
Eu encontrei recentemente um cenário em que se um conjunto continha apenas um único elemento, eu queria fazer algo com esse elemento. Para obter o elemento, eu estabeleci-me sobre esta abordagem:
element = list(myset)[0]
Mas isso não é muito satisfatório, pois cria uma lista desnecessário. Também poderia ser feito com iteração, mas iteração parece artificial, bem como, uma vez que existe apenas um único elemento. Estou faltando alguma coisa simples?
Solução
Tuple obras desembalar.
(element,) = myset
(By the way, python-dev tem explorado, mas rejeitou a adição de myset.get()
para retornar um elemento arbitrário de um conjunto. Discussão aqui , respostas Guido van Rossum 1 e 2 .)
O meu favorito para obter um elemento arbitrário é (quando você tem um número desconhecido, mas também funciona se você tiver apenas um):
element = next(iter(myset)) ¹
1 : em Python 2.5 e antes, você tem que usar iter(myset).next()
Outras dicas
Entre fazendo uma tupla e fazer uma iteração, é quase uma lavagem, mas iteração ganha por um nariz ...:
$ 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
Não sei por que todas as respostas estão usando a iter(x).next()
sintaxe mais antiga em vez do novo next(iter(x))
, que parece preferível para mim (e também trabalha em Python 3.1).
No entanto, vitórias desembalar as mãos para baixo sobre ambos:
$ 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
Este curso é para conjuntos de item único (onde a última forma, como outros mencionados, tem a vantagem de não rápido se o conjunto que "sabia" tinha apenas um item realmente tinha vários). Para conjuntos com N arbitrária> 1 itens, a tupla desacelera, o iter não:
$ 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
Assim, a descompactação para o caso Singleton, e next(iter(x))
para o caso geral, parece melhor.
Kaizer de .se resposta é grande. Mas se o seu conjunto de pode conter mais de um elemento, e você quer um elemento não tão arbitrária, você pode querer usar min
ou max
. Por exemplo:.
element = min(myset)
ou
element = max(myset)
(Não utilize sorted
, porque isso tem uma sobrecarga desnecessária para o esse uso.)
Eu sugiro:
element = myset.pop()
Você pode usar element = tuple(myset)[0]
que é um pouco mais eficiente, ou, você pode fazer algo como
element = iter(myset).next()
Eu acho que construir um iterador é mais eficiente do que a construção de uma tupla / lista.