2011-01-12 16 views
12

Me gustaría hacer una lista de dos listas separadas de artículos únicos.¿Cómo tomar dos listas y combinarlas excluyendo cualquier duplicado?

Hay otras preguntas similares pero no parece haber ninguna que se preocupe por hacer este problema de manera efectiva ya que las listas son de unos pocos millones de elementos.

Totalmente relacionado: ¿soy el único que odia cómo el cuadro de sugerencia de etiquetas cubre el botón "publicar su pregunta"?

+3

Hace el orden de los artículos en las listas importan? –

+0

no pero no están ordenados –

Respuesta

31

Utilice un set.

>>> first = [1, 2, 3, 4] 
>>> second = [3, 2, 5, 6, 7] 
>>> third = list(set(first) | set(second))  # '|' is union 
>>> third 
[1, 2, 3, 4, 5, 6, 7] 
+1

¿Cómo puedo hacerlo sin usar el conjunto? – Dejell

+6

Hola usuario225312, ¿ganas algo llamando a set() dos veces y usando union? Instintivamente, solo escribiría la lista (establecer (primero + segundo)). – Cawb07

+0

tenga en cuenta que este enfoque no se puede utilizar si las listas contienen tipos que no se pueden eliminar (por ejemplo, listas de diccionarios) – Luke404

6
>>> l1 = range(10) 
>>> l2 = range(5, 15) 
>>> set(l1) | set(l2) 
set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]) 
2

Si alguien quiere hacerlo sin set():

a = [1,2,3] 
b = [2,3,4] 
newlist=[] 
for i in a: 
    newlist.append(i) 
for z in b: 
    if z not in newlist: 
     newlist.append(z) 
newlist.sort() 
print newlist 
10

Un poco más eficiente manera de hacerlo:

>>> first = [1, 2, 3, 4] 
>>> second = [3, 2, 5, 6, 7] 

# New way 
>>> list(set(first + second)) 
[1, 2, 3, 4, 5, 6, 7] 
#1000000 loops, best of 3: 1.42 µs per loop 

# Old way 
>>> list(set(first) | set(second)) 
[1, 2, 3, 4, 5, 6, 7] 
#1000000 loops, best of 3: 1.83 µs per loop 

La nueva forma es más eficiente porque sólo tiene un conjunto() en lugar de 2.