2010-05-19 87 views
45
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) 

¡Conseguido hasta ahora, pero parece que no funciona! GraciasComparación de elementos comunes entre 2 listas

Respuesta

97
>>> list1 = [1,2,3,4,5,6] 
>>> list2 = [3, 5, 7, 9] 
>>> list(set(list1).intersection(list2)) 
[3, 5] 
+0

+1 pero personalmente había usado frozenset ya que es inmutable y así se puede utilizar como diccionario clave etc – zebrabox

+6

Esto devolverá los elementos singulares// comunes, pero no todos los elementos repetidos que puedan existir. – Dologan

+0

@SilentGhost. Cómo obtener el número de elementos coincidentes de dos listas. En este caso es 2. – Poka

17

uso conjunto intersecciones, ajuste (lista1) & conjunto (list2)

>>> def common_elements(list1, list2): 
...  return list(set(list1) & set(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'] 
>>> 
>>> 

cuenta que la lista resultado podría ser diferente con el fin lista original.

+0

Gracias por la ayuda. Comprenda dónde me equivoqué y en qué trabajar la próxima vez. :) – Daniel

+0

Eso es genial, Daniel :-) – YOU

+1

gran solución. ¿hay también una manera de preservar el orden con esto? – tarrasch

22

Las soluciones sugeridas por S.Mark y SilentGhost generalmente le dicen cómo debe hacerse de una manera pitonica, 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 ser fijado mediante la creación de una lista result y la recolección de los elementos comunes en esa lista:

def common_elements(list1, list2): 
    result = [] 
    for element in list1: 
     if element in list2: 
      result.append(element) 
    return result 

una versión aún más corta que utilizan las listas por comprensión:

def common_elements(list1, list2): 
    return [element for element in list1 if element in list2] 

Sin embargo, como ya he dicho, se trata de una de manera muy ineficiente de hacer esto - tipos de conjuntos integrados de Python son mucho más eficientes a medida que se implementan en C internamente.

+0

Excelente para ambas propuestas – dlewin

+0

NOTA: Los métodos anteriores solo funcionarán para listas de igual tamaño. Si está trabajando con listas de tamaños desiguales, como yo, entonces deberá evaluar el orden basado en len() antes de llamar a la función: list1 = [2,2,2], list2 [2,3] - > [2,2,2] list1 = [2,3], list2 [2,2,2] -> [2] – redthumb

8

Las respuestas anteriores todo el trabajo para encontrar los elementos comunes únicas, sino que no tienen en cuenta los elementos repetidos en las listas. Si desea que los elementos comunes que aparezcan en el mismo número que se encuentran en común en las listas, puede utilizar el siguiente de una sola línea:

l2, common = l2[:], [ e for e in l1 if e in l2 and (l2.pop(l2.index(e)) or True)] 

La parte or True sólo es necesario si se espera algún elemento a evaluar a False.

+0

Impresionante solución, parece ser la más completa, aunque un poco concisa – Hendeca

+0

Esta debería ser la respuesta que debería haber sido seleccionado! Supongo que también funciona para listas desiguales. También la mayoría de las soluciones usan 'set' que no es estable (también conocido como la orden se pierde). – lifebalance

1

1) Método1 ahorrando lista1 es el diccionario y luego iterar cada elem en lista2

def findarrayhash(a,b): h1={k:1 for k in a} for val in b: if val in h1: print("common found",val) del h1[val] else: print("different found",val) for key in h1.iterkeys(): print ("different found",key) Encontrar elementos comunes y diferentes:

2) Método 2 Utilizando el montaje

def findarrayset(a,b): common = set(a)&set(b) diff=set(a)^set(b) print list(common) print list(diff)

0

Aquí es un método de fuerza más bien bruta que se me ocurrió. Ciertamente no es el más eficiente pero es algo.

El problema que nos encontramos con algunas de las soluciones aquí es que o bien no da elementos repetidos o no da el número correcto de elementos cuando los puntos de entrada de pedidos.

#finds common elements 
def common(list1, list2): 
    result = [] 
    intersect = list(set(list1).intersection(list2)) 

    #using the intersection, find the min 
    count1 = 0 
    count2 = 0 
    for i in intersect: 
     for j in list1: 
      if i == j: 
       count1 += 1 
     for k in list2: 
      if i == k: 
       count2 += 1 
     minCount = min(count2,count1) 
     count1 = 0 
     count2 = 0 

     #append common factor that many times 
     for j in range(minCount): 
      result.append(i) 

    return result 
16

También puede usar conjuntos y obtener los rasgos comunes en una línea: restar el conjunto que contiene las diferencias de uno de los conjuntos.

A = [1,2,3,4] 
B = [2,4,7,8] 
commonalities = set(A) - (set(A) - set(B)) 
Cuestiones relacionadas