¿Cuál es el "one [...] obvious way" para agregar todos los elementos de un iterable a uno existente set
?Python: cómo agregar los contenidos de un iterable a un conjunto?
Respuesta
por el conjunto, ¿te refieres a set
?
>>> foo = set(range(0, 4))
>>> foo
set([0, 1, 2, 3])
>>> foo.update(range(2, 6))
>>> foo
set([0, 1, 2, 3, 4, 5])
Me encanta esta manera:
set = [item for item in items]
@dolma, yo no quiero * * crear un nuevo conjunto, pero añadir a una conjunto existente. Lo siento si eso no estaba claro; He editado la pregunta para aclarar. –
@dolma, también, (a) puedes hacer 's = set (items)' y (b) tu ejemplo redefine un built-in :) –
entonces simplemente puedes hacer 'set.extend ([item for item in items ]) ', Supongo ... – dolma33
Uso lista por comprensión.
Un cortocircuito en la creación de una lista iterables usando por ejemplo :)
>>> x = [1, 2, 3, 4]
>>>
>>> k = x.__iter__()
>>> k
<listiterator object at 0x100517490>
>>> l = [y for y in k]
>>> l
[1, 2, 3, 4]
>>>
>>> z = Set([1,2])
>>> z.update(l)
>>> z
set([1, 2, 3, 4])
>>>
[Editar: se perdió la parte conjunto de pregunta]
¿No veo ningún conjunto? ¿Me estoy perdiendo de algo? –
@Ian Mackinnon: ¡Aah! Perdí ese punto por completo. Gracias. – pyfunc
for item in items:
extant_set.add(item)
Para el registro, creo que la afirmación de que "No debe haber uno-- y preferiblemente sólo una manera --obvious para hacerlo." es falso Supone que muchas personas con mentalidad técnica creen que todos piensan igual. Lo que es obvio para una persona no es tan obvio para otra.
Yo diría que mi solución propuesta es claramente legible, y hace lo que pide. No creo que haya éxitos de rendimiento involucrados, aunque admito que me podría estar perdiendo algo. Pero a pesar de todo eso, puede que no sea obvio y preferible para otro desarrollador.
Los conjuntos tienen el método add también:
>>> s=set([1,2,3,4])
>>> for n in range(10):
s.add(n)
>>> s
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Usted puede utilizar la función set() para convertir un iterable en un conjunto, y luego usar el operador de actualización del conjunto estándar (| =) para agregar los valores únicos desde su nuevo conjunto al existente.
>>> a = { 1, 2, 3 }
>>> b = (3, 4, 5)
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])
El uso de '.update' tiene la ventaja de que el argumento puede ser iterable -no necesariamente un conjunto- a diferencia del RHS del operador' | = 'en su ejemplo. – tzot
Buen punto. Es solo una elección estética ya que set() puede convertir un iterable en un conjunto, pero el número de teclas es el mismo. – gbc
Nunca antes había visto ese operador, disfrutaré usarlo cuando aparezca en el futuro; ¡Gracias! – eipxen
En beneficio de cualquier persona que pueda creer, p. que hacer aset.add()
en un bucle tendría un rendimiento competitivo con hacer aset.update()
, he aquí un ejemplo de cómo se puede poner a prueba sus creencias de forma rápida antes de hacerlo público:
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 294 usec per loop
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 950 usec per loop
>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 458 usec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 598 usec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 1.89 msec per loop
>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 891 usec per loop
Parece que el coste por artículo del enfoque de bucle es más de tres veces el del enfoque update
.
El uso de |= set()
cuesta alrededor de 1.5x que update
hace la mitad de lo que agrega cada elemento individual en un ciclo.
Sólo una rápida actualización, los tiempos de uso de Python 3:
#!/usr/local/bin python3
from timeit import Timer
a = set(range(1, 100000))
b = list(range(50000, 150000))
def one_by_one(s, l):
for i in l:
s.add(i)
def cast_to_list_and_back(s, l):
s = set(list(s) + l)
def update_set(s,l):
s.update(l)
resultados son los siguientes:
one_by_one 10.184448844986036
cast_to_list_and_back 7.969255169969983
update_set 2.212590195937082
- 1. ¿Cómo puedo enumerar los contenidos de un directorio en Python?
- 2. ¿Cómo agregar una imagen a los contenidos usando HAML?
- 3. Python: Int no es un error iterable
- 4. ¿Cómo incrustar los contenidos de un CALayer?
- 5. Scala: La exposición de un conjunto de resultados JDBC a través de un generador (iterable)
- 6. ¿Cómo adjuntar los contenidos de un mapa a otro mapa?
- 7. ¿Cómo puedo convertir un Iterable de Java a un Iterable de Scala?
- 8. cómo agregar docenas de casos de prueba a un conjunto de pruebas automáticamente en python
- 9. agregar conjunto a otro conjunto
- 10. valores Anexar a un conjunto en Python
- 11. Eliminar contenidos de la matriz según un conjunto de índices
- 12. Agregar a innerHTML sin destruir los contenidos del formulario
- 13. ¿Cómo identificar los contenidos de un byte [] es un jpeg?
- 14. ¿Cómo comprobar si un objeto es iterable en Python?
- 15. ¿Cómo convertir un conjunto de python a una matriz numpy?
- 16. Seleccionar todos los contenidos de un div
- 17. Agregar el número 1 a un conjunto no tiene efecto
- 18. Java: recorrer un conjunto de contenidos, mientras se están modificando conjunto
- 19. Python: cómo permitir duplicados en un conjunto?
- 20. Crear un diccionario a partir de un iterable
- 21. Python iterable Cola
- 22. Ver los contenidos de un dll
- 23. Anexar elementos de un conjunto a una lista en Python
- 24. Agregar cadenas cortas a un conjunto en Ruby es lento
- 25. Scala: Agrupe un Iterable en un Iterable de Iterables por un predicado
- 26. ¿Cómo ver los contenidos de un archivo APK de Android?
- 27. Python: miembros de acceso de un conjunto
- 28. ¿Cómo saber la diferencia entre un iterador y un iterable?
- 29. ¿Cómo leo los contenidos de un directorio en Perl?
- 30. Retorno Iterable con Mock Python
Sí, no esperaba que fuera ambiguo, pero parece que sí :) La actualización es la verdadera. ¡Gracias! –
Acabo de volver a mi sesión de intérprete y de hecho lo intenté, pero pensé que había agregado toda la lista como un elemento del conjunto debido a los corchetes en la representación del conjunto. Nunca antes me había dado cuenta de que están representados así. –
Esa representación le permite pegarla nuevamente en una sesión interactiva, porque el constructor 'set' toma un iterable como argumento. –