2011-09-15 8 views
6

necesito para unir dos listas en python3, donde pueden existir duplicados, y por un conjunto de éstas la lista resultante contendrá tantos como máximo, en tanto ejemplo lists.An pueda clarificarlo:lista de unión con los duplicados

[1,2,2,5](some operator)[2,5,5,5,9]=[1,2,2,5,5,5,9] 

Ideas?

Respuesta

12

Usted puede utilizar la clase collections.Counter:

>>> from collections import Counter 
>>> combined = Counter([1,2,2,5]) | Counter([2,5,5,5,9]) 
>>> list(combined.elements()) 
[1, 2, 2, 5, 5, 5, 9] 

Funciona como un conjunto múltiple (una colección desordenada, donde cada elemento puede aparecer varias veces). El operador | le da la unión de los multisectos, donde cada elemento aparece max (apperances_in_counter1, appearances_in_counter2) veces.

Esta clase se ha agregado en Python 2.7 y 3.1.

+0

nice ... No conocía ese módulo. – kaiseroskilo

+0

funciona desde python 2.7 – varela

+1

Genial, no lo conocía. Dado que el término "multiset" me parece una palabra de moda total, permítanme citar su descripción de los documentos de Python: ** "A Counter es una subclase dict para contar objetos hashable". ** Encuentro esta descripción más intuitiva, espero que también lo hará – Kos

1
  1. matrices Convertir a los diccionarios con a[key] = count

  2. Crear nuevo diccionario con las normas c[key] = a.get(key, 0) > b.get(key, 0) and a[key] or b[key]. Necesita repetir las dos teclas en a y en b dicts.

  3. Ampliar el diccionario, result += [value] * key

2

¿Por qué las listas de uso en primer lugar? Que los datos se parece a un diccionario para mí:

[1,2,2,5] -> {1: 1, 2: 2, 5: 1} 
[2,5,5,5,9] -> {2: 1, 5: 3, 9: 1} 

Entonces es simple:

keys = set(a.keys()+b.keys()) 
vals = [max(a.get(n, 0), b.get(n, 0)) for n in keys] 
d = dict(zip(keys, vals)) 
print d 

Resultado:

{1: 1, 2: 2, 5: 3, 9: 1}

+1

Actualización: siguiendo la respuesta de @interjay, obtienes esencialmente el mismo modelo de datos, pero ya implementado con métodos para operarlo. ¡Busca esa solución! – Kos

Cuestiones relacionadas