2010-10-28 3 views

Respuesta

154

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]) 
+3

Sí, no esperaba que fuera ambiguo, pero parece que sí :) La actualización es la verdadera. ¡Gracias! –

+2

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í. –

+6

Esa representación le permite pegarla nuevamente en una sesión interactiva, porque el constructor 'set' toma un iterable como argumento. –

-4

Me encanta esta manera:

set = [item for item in items] 
+0

@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. –

+0

@dolma, también, (a) puedes hacer 's = set (items)' y (b) tu ejemplo redefine un built-in :) –

+0

entonces simplemente puedes hacer 'set.extend ([item for item in items ]) ', Supongo ... – dolma33

-1

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]

+1

¿No veo ningún conjunto? ¿Me estoy perdiendo de algo? –

+1

@Ian Mackinnon: ¡Aah! Perdí ese punto por completo. Gracias. – pyfunc

-1
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.

+0

Argh! El bucle for que está en una línea como esa está formateando en mi respuesta: nunca haría eso. Nunca. – jaydel

+1

sets usa 'add' not' append' – FogleBird

+0

Tiene toda la razón. Edité la publicación para reparar mi daño. Gracias :) – jaydel

0

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]) 
7

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]) 
+4

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

+1

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

+0

Nunca antes había visto ese operador, disfrutaré usarlo cuando aparezca en el futuro; ¡Gracias! – eipxen

30

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.

0

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 
Cuestiones relacionadas