Elementos comunes entre dos listas que no usan conjuntos en Python

Quiero contar los mismos elementos de dos listas. Las listas pueden tener elementos duplicados, por lo que no puedo convertir esto en conjuntos y uso y operador.

a=[2,2,1,1] b=[1,1,3,3] 

set (a) y set (b) trabajo
a y b no funcionan

¿Es posible hacerlo con voz alta y dictonary?

En Python 3.x (y Python 2.7, cuando se lanza), puedes usar colecciones. Encuentra esto para:

 >>> from collections import Counter >>> list((Counter([2,2,1,1]) & Counter([1,3,3,1])).elements()) [1, 1] 

Aquí hay una alternativa que utiliza collections.defaultdict (disponible en Python 2.5 y versiones posteriores). Tiene la bonita propiedad de que el orden del resultado es determinista (esencialmente corresponde al orden de la segunda lista).

 from collections import defaultdict def list_intersection(list1, list2): bag = defaultdict(int) for elt in list1: bag[elt] += 1 result = [] for elt in list2: if elt in bag: # remove elt from bag, making sure # that bag counts are kept positive if bag[elt] == 1: del bag[elt] else: bag[elt] -= 1 result.append(elt) return result 

Para ambas soluciones, el número de apariciones de cualquier elemento x en la lista de salida es el mínimo de las ocurrencias de x en las dos listas de entrada. De su pregunta no queda claro si este es el comportamiento que desea.

El uso de conjuntos es el más eficiente, pero siempre se podría hacer r = [i for i in l1 if i in l2] .

SilentGhost, Mark Dickinson y Lo’oris tienen razón. Muchas gracias por informar de este problema. Necesito una parte común de las listas, así que:

a = [1,1,1,2]

b = [1,1,3,3]

el resultado debe ser [1,1]

Lo siento por el comentario en lugar no adecuado – me he registrado hoy.

He modificado tus soluciones:

 def count_common(l1,l2): l2_copy=list(l2) counter=0 for i in l1: if i in l2_copy: counter+=1 l2_copy.remove(i) return counter l1=[1,1,1] l2=[1,2] print count_common(l1,l2) 

1