Como extrair o membro a partir de um único membro do conjunto em python?

StackOverflow https://stackoverflow.com/questions/1619514

  •  06-07-2019
  •  | 
  •  

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top