Tengo dos listas en Python, como estas:
temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']
Necesito crear una tercera lista con elementos de la primera lista que no están presentes en la segunda. Del ejemplo tengo que obtener:
temp3 = ['Three', 'Four']
¿Hay formas rápidas sin ciclos y comprobaciones?
python
performance
list
set
set-difference
Max Frai
fuente
fuente
temp1 = ['One', 'One', 'One']
ytemp2 = ['One']
, ¿quiere['One', 'One']
volver o[]
?Respuestas:
Cuidado con eso
donde podría esperar / querer que sea igual
set([1, 3])
. Si quieresset([1, 3])
como respuesta, deberás usarlaset([1, 2]).symmetric_difference(set([2, 3]))
.fuente
TypeError: 'str' object is not callable
a = [1,2,2,2,3]
b = [2]
Todas las soluciones existentes ofrecen una u otra de:
Pero hasta ahora ninguna solución tiene ambas. Si quieres ambos, prueba esto:
Prueba de rendimiento
Resultados:
El método que presenté, así como el orden de preservación, también es (ligeramente) más rápido que la sustracción del conjunto porque no requiere la construcción de un conjunto innecesario. La diferencia de rendimiento sería más notable si la primera lista es considerablemente más larga que la segunda y si el hashing es costoso. Aquí hay una segunda prueba que demuestra esto:
Resultados:
fuente
fuente
temp2
en un conjunto antes haría esto un poco más eficiente.item not in temp2
yitem not in set(temp2)
siempre devolverá los mismos resultados, independientemente de si hay duplicados o notemp2
.La diferencia entre dos listas (digamos list1 y list2) se puede encontrar usando la siguiente función simple.
o
Al usar la función anterior, la diferencia se puede encontrar usando
diff(temp2, temp1)
odiff(temp1, temp2)
. Ambos darán el resultado['Four', 'Three']
. No tiene que preocuparse por el orden de la lista o qué lista se debe dar primero.Referencia de documento de Python
fuente
En caso de que desee la diferencia de forma recursiva, he escrito un paquete para python: https://github.com/seperman/deepdiff
Instalación
Instalar desde PyPi:
Ejemplo de uso
Importador
El mismo objeto vuelve vacío
El tipo de un artículo ha cambiado
El valor de un artículo ha cambiado
Artículo agregado y / o eliminado
Diferencia de cadena
Diferencia de cuerda 2
Cambio de tipo
Lista de diferencia
Lista de diferencia 2:
Enumere la diferencia ignorando el orden o los duplicados: (con los mismos diccionarios que arriba)
Lista que contiene el diccionario:
Conjuntos
Tuplas nombradas:
Objetos personalizados:
Atributo de objeto agregado:
fuente
Se puede hacer usando el operador python XOR.
fuente
de la manera más simple,
use set (). diferencia (set ())
la respuesta es
set([1])
puede imprimir como una lista,
fuente
Si realmente está buscando rendimiento, ¡use numpy!
Aquí está el cuaderno completo como una esencia de github con comparación entre list, numpy y pandas.
https://gist.github.com/denfromufa/2821ff59b02e9482be15d27f2bbd4451
fuente
Voy a tirar porque ninguna de las soluciones actuales produce una tupla:
alternativamente:
Al igual que las otras respuestas que no producen tuplas en esta dirección, conserva el orden
fuente
Yo quería algo que llevaría dos listas y podría hacer lo que
diff
enbash
lo hace. Dado que esta pregunta aparece primero cuando busca "python diff two lists" y no es muy específica, publicaré lo que se me ocurrió.Usando
SequenceMather
desdedifflib
usted puede comparar dos listas como lodiff
hace. Ninguna de las otras respuestas le dirá la posición donde se produce la diferencia, pero esta sí. Algunas respuestas dan la diferencia en una sola dirección. Algunos reordenan los elementos. Algunos no manejan duplicados. Pero esta solución le brinda una verdadera diferencia entre dos listas:Esto produce:
Por supuesto, si su aplicación hace las mismas suposiciones que las otras respuestas, se beneficiará más de ellas. Pero si está buscando una verdadera
diff
funcionalidad, entonces este es el único camino a seguir.Por ejemplo, ninguna de las otras respuestas podría manejar:
Pero este sí:
fuente
Prueba esto:
fuente
esto podría ser incluso más rápido que la comprensión de la lista de Mark:
fuente
from itertools import filterfalse
bit aquí. También tenga en cuenta que esto no devuelve una secuencia como las demás, devuelve un iterador.Aquí hay una
Counter
respuesta para el caso más simple.Esto es más corto que el anterior que hace diferencias bidireccionales porque solo hace exactamente lo que la pregunta pregunta: generar una lista de lo que está en la primera lista pero no en la segunda.
Alternativamente, dependiendo de sus preferencias de legibilidad, lo convierte en una línea decente:
Salida:
Tenga en cuenta que puede eliminar la
list(...)
llamada si solo está iterando sobre ella.Debido a que esta solución utiliza contadores, maneja las cantidades correctamente frente a las muchas respuestas basadas en conjuntos. Por ejemplo en esta entrada:
El resultado es:
fuente
Podría usar un método ingenuo si los elementos del difflist están ordenados y establecidos.
o con métodos de configuración nativos:
Solución ingenua: 0.0787101593292
Solución de conjunto nativo: 0.998837615564
fuente
Estoy demasiado tarde en el juego para esto, pero puedes hacer una comparación del rendimiento de algunos de los códigos mencionados anteriormente con esto, dos de los contendientes más rápidos son,
Pido disculpas por el nivel elemental de codificación.
fuente
Aquí hay algunos simples, preservar el orden formas de diferenciar dos listas de cadenas.
Código
Un enfoque inusual usando
pathlib
:Esto supone que ambas listas contienen cadenas con comienzos equivalentes. Ver los documentos para más detalles. Tenga en cuenta que no es particularmente rápido en comparación con las operaciones establecidas.
Una implementación sencilla usando
itertools.zip_longest
:fuente
temp1
ytemp2
se alinean bien. Si, por ejemplo, cambia los elementostemp2
o inserta algún otro valor al principio detemp2
, la listacomp solo devolverá los mismos elementos que entemp1
Esta es otra solución:
fuente
Si te encuentras con
TypeError: unhashable type: 'list'
que necesitas convertir listas o conjuntos en tuplas, por ejemploConsulte también ¿Cómo comparar una lista de listas / conjuntos en Python?
fuente
Digamos que tenemos dos listas
Podemos ver en las dos listas anteriores que los elementos 1, 3, 5 existen en la lista 2 y los elementos 7, 9 no. Por otro lado, los ítems 1, 3, 5 existen en la lista1 y los ítems 2, 4 no.
¿Cuál es la mejor solución para devolver una nueva lista que contiene los elementos 7, 9 y 2, 4?
Todas las respuestas anteriores encuentran la solución, ¿cuál es la más óptima?
versus
Usando timeit podemos ver los resultados
devoluciones
fuente
versión de línea única de solución arulmr
fuente
si quieres algo más como un conjunto de cambios ... podrías usar Counter
fuente
Podemos calcular la intersección menos la unión de listas:
fuente
Esto se puede resolver con una línea. La pregunta se da dos listas (temp1 y temp2) devuelven su diferencia en una tercera lista (temp3).
fuente
Aquí hay una manera simple de distinguir dos listas (cualquiera que sea el contenido), puede obtener el resultado como se muestra a continuación:
Espero que esto sea útil.
fuente
Prefiero usar la conversión a conjuntos y luego usar la función "diferencia ()". El código completo es:
Salida:
Es el más fácil de entender y, en el futuro, si trabaja con datos grandes, convertirlos en conjuntos eliminará los duplicados si no se requieren duplicados. Espero eso ayude ;-)
fuente
fuente
por ejemplo, si
list1 = [10, 15, 20, 25, 30, 35, 40]
ylist2 = [25, 40, 35]
luego la lista devuelta seráoutput = [10, 20, 30, 15]
fuente