Sumar Contadores de Palabras


Descripción

Imagina que ejecutas la función value_counts con dos palabras diferentes y guardas los resultados en dos diccionarios Suppose you run value_counts with two different words and save the results in two dictionaries.

counter1 = value_counts('brontosaurus')
counter2 = value_counts('apatosaurus')

Cada diccionario asocia un conjunto de letras con el número de veces que aparecen. Escribe una función llamada add_counters que tome dos diccionarios como estos y devuelva un nuevo diccionario que contenga todas las letras y el total de veces que aparecen en cualquiera de las dos palabras.

Hay muchas formas de resolver este problema, Una vez que tengas una solución que funciona, considera preguntarle a un asistente virtual por otras soluciones.

Ejemplo de Ejecución:

# Algunas repetidas
counter1 = value_counts('brontosaurus')
counter2 = value_counts('apatosaurus')
print(add_counters(counter1, counter2))

# Ninguna repetida
counter1 = {'c': 1, 'a': 1, 't': 1}  # cat
counter2 = {'d': 1, 'o': 1, 'g': 1}  # dog
print(add_counters(counter1, counter2))

# Todas repetidas
counter1 = {'s': 1, 'p': 1, 'o': 1, 't': 1}  # spot
counter2 = {'s': 1, 't': 1, 'o': 1, 'p': 1}  # stop
print(add_counters(counter1, counter2))

{'b': 1, 'r': 3, 'o': 3, 'n': 1, 't': 2, 's': 4, 'a': 4, 'u': 4, 'p': 1}
{'c': 1, 'a': 1, 't': 1, 'd': 1, 'o': 1, 'g': 1}
{'s': 2, 'p': 2, 'o': 2, 't': 2}

Solución

Mostrar solución
def value_counts(string):
  counter = {}
  for letter in string:
    counter[letter] = counter.get(letter, 0) + 1
  return counter


def add_counters(counter1, counter2):
  result = {}
  for k, v in counter1.items():
    result[k] = counter1.get(k, 0)

  for k, v in counter2.items():
    if k in result:
      result[k] += counter2[k]
    else:
      result[k] = counter2.get(k, 0)

  return result

# Algunas repetidas
counter1 = value_counts('brontosaurus')
counter2 = value_counts('apatosaurus')
print(add_counters(counter1, counter2))

# Ninguna repetida
counter1 = {'c': 1, 'a': 1, 't': 1}  # cat
counter2 = {'d': 1, 'o': 1, 'g': 1}  # dog
print(add_counters(counter1, counter2))

# Todas repetidas
counter1 = {'s': 1, 'p': 1, 'o': 1, 't': 1}  # spot
counter2 = {'s': 1, 't': 1, 'o': 1, 'p': 1}  # stop
print(add_counters(counter1, counter2))

Probar solución en Google Colab

Fuente del ejercicio: https://allendowney.github.io/ThinkPython/chap10.html#id3