Necesito unir dos listas en Python3, donde pueden existir duplicados, y para un conjunto de estos, la lista resultante contendrá hasta el máximo en ambas listas. Un ejemplo podría aclararlo:

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

¿Ideas?

7
kaiseroskilo 15 sep. 2011 a las 16:37

3 respuestas

La mejor respuesta

Puede usar 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 ofrece la unión de los conjuntos múltiples, donde cada elemento aparece max (apariencias_en_contador1, apariencias_en_contador2) veces.

Esta clase se agregó en Python 2.7 y 3.1.

13
interjay 15 sep. 2011 a las 12:53
  1. Convierta matrices a diccionarios con a[key] = count

  2. Cree un nuevo diccionario con las reglas c[key] = a.get(key, 0) > b.get(key, 0) and a[key] or b[key]. Debe iterar a través de ambas teclas en ay dictos.

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

1
unkulunkulu 4 jul. 2012 a las 12:52

¿Por qué usar listas en primer lugar? Esa información me parece un dict:

[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}

2
Kos 15 sep. 2011 a las 12:43