Estoy tratando de eliminar los duplicados de las 2 listas. así que escribí esta función:

a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"]

b = ["ijk", "lmn", "opq", "rst", "123", "456", ]

for i in b:
    if i in a:
        print "found " + i
        b.remove(i)

print b

Pero me parece que la coincidencia de los elementos siguientes un elemento coincidente no consigue eliminar.

Puedo obtener resultado como este:

found ijk
found opq
['lmn', 'rst', '123', '456']

pero espero que de resultado como este:

[‘123’, ‘456’]

¿Cómo puedo arreglar mi función para hacer lo que quiero?

Gracias.

Me dio una solución que se mantiene al tanto de tus listas, en el mismo orden, y elimina los duplicados en cada uno de ellos. Supongo que esto es lo que estaba buscando.

OriginalEl autor michael | 2013-08-12

7 Comentarios

  1. 24

    Aquí es lo que está pasando. Supongamos que tiene esta lista:

    ['a', 'b', 'c', 'd']

    y bucle a través de cada elemento en la lista. Supongamos que usted está actualmente en la posición de índice 1:

    ['a', 'b', 'c', 'd']
           ^
           |
       index = 1

    …y se elimina el elemento en la posición de índice 1, dando este:

    ['a',      'c', 'd']
           ^
           |
        index 1

    Después de eliminar el elemento, los otros elementos de la diapositiva a la izquierda, dando esto:

    ['a', 'c', 'd']
           ^
           |
        index 1

    Entonces cuando el bucle se ejecuta de nuevo el bucle incrementa el índice de 2, dando esto:

    ['a', 'c', 'd']
                ^ 
                |
             index = 2

    Ver cómo se ha saltado ‘c’? La lección es: nunca eliminar un elemento de una lista en la que están recorrer.

    Esta respuesta contiene una muy clara explicación de la causa de los problemas, no entiendo por qué tiene un voto negativo.
    Sí, estás en lo correcto. Esperamos que sea un error que puede ser corregido porque downvotes están bloqueados una vez dado.
    Tal vez la razón por la downvotes es la ausencia de una solución de trabajo…

    OriginalEl autor 7stud

  2. 11

    Tu problema parece ser que va a cambiar la lista está iterando. Iterar a través de una copia de la lista en su lugar.

    for i in b[:]:
        if i in a:
            b.remove(i)
    
    
    >>> b
    ['123', '456']

    Pero, ¿Cómo sobre el uso de una lista de comprensión lugar?

    >>> a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"]
    >>> b = ["ijk", "lmn", "opq", "rst", "123", "456", ]
    >>> [elem for elem in b if elem not in a ]
    ['123', '456']
    Si el a lista crece, puede convertirlo en un set es mucho más eficiente (x in s es O(1) para los conjuntos, O(n) para las listas) de acuerdo a la wiki.python.org/moin/TimeComplexity
    Puede usted por favor dejar un comentario sobre lo que estaba mal con esta respuesta? Realmente me gustaría mejorarlo. 🙂
    Para el registro, yo no downvote. 🙂
    Yo sé. Gracias por tu respuesta anterior, aunque. 🙂

    OriginalEl autor Sukrit Kalra

  3. 9

    Lo que acerca de

    b= set(b) - set(a)

    Si usted necesita posibles repeticiones en b también aparecen repetidas en el resultado y/o el fin de ser conservado, a continuación,

    b= [ x for x in b if not x in a ] 

    haría.

    Esta respuesta fue votada abajo una vez. ¿Alguien puede decir por qué? Cualquier tumba sintaxis/error conceptual? No contribuye a la pregunta (y teniendo en cuenta que a veces es muy difícil entender lo que se pregunta)? Mal inglés hasta el punto de la ininteligibilidad?

    OriginalEl autor Mario Rossi

  4. 2

    Que pidió quitar las listas de duplicados, aquí está mi solución:

    from collections import OrderedDict
    a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"]
    b = ["ijk", "lmn", "opq", "rst", "123", "456", ]
    
    x = OrderedDict.fromkeys(a)
    y = OrderedDict.fromkeys(b)
    
    for k in x:
        if k in y:
            x.pop(k)
            y.pop(k)
    
    
    print x.keys()
    print y.keys()

    Resultado:

    ['abc', 'def', 'xyz']
    ['123', '456']

    Lo bueno aquí es que se mantenga el orden de las listas de elementos

    OriginalEl autor Anthony Perot

  5. 1

    o un conjunto

    set(b).difference(a)

    estar prevenido conjuntos no preservar el orden si que es importante

    OriginalEl autor Joran Beasley

  6. 1

    Una forma de evitar el problema de la edición de una lista de iterar sobre ella, es el uso de comprensión:

    a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"]
    b = ["ijk", "lmn", "opq", "rst", "123", "456", ]
    b = [x for x in b if not x in a]
    Misma solución publicado hace 1h por Mario Rossi y Sukrit Kalra.
    Tal vez @Mayur Patel comenzó a escribir al mismo tiempo que yo. Este es un tema para el meta (supongo): el bloqueo de preguntas cuando 1 o tal vez 2) la gente está respondiendo a ellos (por cierta cantidad de tiempo?), o, al menos, una indicación de cómo muchas otras personas es la respuesta a ellos. Me refiero a antes de que las respuestas son publicado. Soy un noobie, aunque. Si algo como esto es que ya existe, por favor hágamelo saber.

    OriginalEl autor Mayur Patel

  7. 0

    Ya hay muchas respuestas en «¿cómo se puede solucionar?», así que este es un «¿cómo podemos mejorar y ser más python?»: ya que lo que queremos lograr es obtener la diferencia entre la lista de b y lista a, usted debe utilizar la operación de diferencias en los conjuntos (las operaciones sobre conjuntos):

    >>> a = ["abc", "def", "ijk", "lmn", "opq", "rst", "xyz"]
    >>> b = ["ijk", "lmn", "opq", "rst", "123", "456", ]
    >>> s1 = set(a)
    >>> s2 = set(b)
    >>> s2 - s1
    set(['123', '456'])

    OriginalEl autor Vincenzo Pii

Dejar respuesta

Please enter your comment!
Please enter your name here