python - seleccionar - pandas agregar columna
¿Cómo extraer el miembro del conjunto de un solo miembro en Python? (5)
Recientemente encontré un escenario en el que si un conjunto solo contenía un elemento, quería hacer algo con ese elemento. Para obtener el elemento, me decidí por este enfoque:
element = list(myset)[0]
Pero esto no es muy satisfactorio, ya que crea una lista innecesaria. También se podría hacer con iteración, pero la iteración parece antinatural también, ya que solo hay un elemento. ¿Me estoy perdiendo algo simple?
Entre hacer una tupla y hacer un iterador, es casi un lavado, pero la iteración gana por la 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
No estoy seguro de por qué todas las respuestas usan el sintaxis anterior iter(x).next()
lugar del nuevo next(iter(x))
, que me parece preferible (y también funciona en Python 3.1).
Sin embargo, el desempaquetar gana sin problemas 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
Por supuesto, esto es para conjuntos de un solo elemento (donde la última forma, como se mencionó en otros, tiene la ventaja de fallar rápidamente si el conjunto que "sabía" tenía solo un elemento en realidad tenía varios). Para conjuntos con elementos N> 1 arbitrarios, la tupla se ralentiza, el iter no:
$ 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
Entonces, desempaquetar para el caso singleton, y next(iter(x))
para el caso general, parece mejor.
Me parece que la respuesta de kaizer.se es genial. Pero si su conjunto puede contener más de un elemento, y desea un elemento no tan arbitrario, puede usar min
o max
. P.ej:
element = min(myset)
o:
element = max(myset)
(No utilice sorted
, ya que tiene una sobrecarga innecesaria para este uso).
Tuple desempaquetado funciona.
(element,) = myset
(Por cierto, python-dev ha explorado pero rechazado la adición de myset.get()
para devolver un elemento arbitrario de un conjunto. La discusión aquí , Guido van Rossum responde 1 y 2 ).
Mi favorito personal para obtener un elemento arbitrario es (cuando tienes un número desconocido, pero también funciona si solo tienes uno):
element = next(iter(myset)) ¹
1 : en Python 2.5 y antes, tienes que usar iter(myset).next()
Yo sugiero:
element = myset.pop()
puedes usar element = tuple(myset)[0]
que es un poco más eficiente, o puedes hacer algo como
element = iter(myset).next()
Supongo que construir un iterador es más eficiente que construir una tupla / lista.