def common_elements(list1, list2):
"""
Return a list containing the elements which are in both list1 and list2
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
"""
for element in list1:
if element in list2:
return list(element)
¡Lo tengo hasta ahora, pero parece que no puedo hacer que funcione!
¿Algunas ideas?
Respuestas:
fuente
También puede usar conjuntos y obtener los puntos en común en una línea: reste el conjunto que contiene las diferencias de uno de los conjuntos.
fuente
Las soluciones propuestas por San Marcos, y SilentGhost generalmente indican cómo se debe hacer de una manera Pythonic, pero pensé que también podría beneficiarse de saber por qué su solución no funciona. El problema es que tan pronto como encuentre el primer elemento común en las dos listas, solo devolverá ese único elemento. Su solución podría solucionarse creando una
result
lista y recopilando los elementos comunes en esa lista:Una versión aún más corta que usa comprensiones de listas:
Sin embargo, como dije, esta es una forma muy ineficiente de hacer esto: los tipos de conjuntos integrados de Python son mucho más eficientes ya que se implementan en C internamente.
fuente
use set intersections, set (list1) y set (list2)
Tenga en cuenta que la lista de resultados podría tener un orden diferente con la lista original.
fuente
puedes usar una simple lista de comprensión:
fuente
Establecer es otra forma en que podemos resolver esto
fuente
lista1 = [1,2,3,4,5,6] lista2 = [3,5,7,9]
Sé que 3 formas pueden resolver esto. Por supuesto, podría haber más.
1-
2-
3-
La tercera forma es la más rápida porque los conjuntos se implementan utilizando tablas hash.
fuente
Las respuestas anteriores funcionan para encontrar los elementos comunes únicos, pero no tendrán en cuenta los elementos repetidos en las listas. Si desea que los elementos comunes aparezcan en el mismo número que los que se encuentran en común en las listas, puede usar la siguiente línea:
La
or True
parte solo es necesaria si espera que se evalúe algún elementoFalse
.fuente
set
que no es estable (también conocido como el orden se pierde).Comparé cada uno de los métodos que menciona cada respuesta. En este momento uso Python 3.6.3 para esta implementación. Este es el código que he usado:
Si ejecuta este código, puede ver que si usa la lista o el generador (si itera sobre el generador, no solo lo usa. Lo hice cuando forcé al generador a imprimir la longitud), obtendrá casi el mismo rendimiento. Pero si usa set, obtendrá un rendimiento mucho mejor. Además, si utiliza el método de intersección, obtendrá un rendimiento un poco mejor. El resultado de cada método en mi computadora aparece a continuación:
fuente
esta es mi propuesta, creo que es más fácil con conjuntos que con un bucle for
fuente
¿Por qué no usar
list comprehension
?Solución de media línea:
fuente
1) Método1 guardar lista1 es diccionario y luego iterar cada elemento en lista2
Encontrar elementos comunes y diferentes:
2) Método2 usando set
fuente
Usa un generador:
La ventaja aquí es que esto volverá en tiempo constante (casi instantáneo) incluso cuando se utilicen listas enormes u otros iterables enormes.
Por ejemplo,
Todas las demás respuestas aquí llevarán mucho tiempo con estos valores para list1 y list2.
Luego puede iterar la respuesta con
O conviértalo a una lista con
fuente
for i in common: print(i)
. Los generadores son iterables que se usan con frecuencia en lugar de otros iterables, como las listas.