4

Explicación del Programa del Video 29 (encontrar el primer carácter que no se repite)

Saludos me gusto el programa desarrollado en el video de esta clase y quiero compartirlo con ustedes compañeros de platzi.

**Quiero empezar antes que nada por explicar las funciones de python que se utilizan en este programa. La primera de estas:
**
enumerate(): Esta función sirve para agregar un contador a un objeto iterable y lo retorna (el objeto enumerado).
Este Método toma dos parámetros. El primero es el objeto iterable y el segundo es opcional y se utiliza para comenzar el contador desde ese numero, si se omite como se realiza en el programa del ** video 29**, se asume que empieza desde 0.

Ahora quiero recordar que una tupla es también un objeto iterable y que podemos acceder a sus elementos usando indices.
En este caso por ejemplo la (1, 2) el valor uno corresponde al indice 0 y el valor 2 al indice 1.

LA SEGUNDA FUNCIÓN QUE NECESITO QUE CONOZCAN ES SORTED()
La función retorna una lista ordenada de un objeto especifico que le pasamos como argumento.
Voy a explicar la sintaxis: sorted(objeto_iterable, key = key, reverse = reverse)

Nota: No podemos ordenar una lista que contenga ambos valores string y números.

Permitan me explicarles los argumentos:

  1. **objeto_iterable **es el primer parámetro y es obligatorio ya que es la secuencia que vamos a ordenar (listas, diccionarios, tuplas, etc).
  2. **key **es un parámetro opcional. Una función que decide el orden que sorted nos regresara los items en una lista. Por defectos en None.
  3. reverse es un parámetro opcional. Es un buleano. Si es False sera ordenado de forma ascendente, True sera ordenado de forma descendente. Por defecto es False.

LA ÚLTIMA FUNCIÓN QUE DEBEMOS CONOCER PARA ENTENDER ESTE PROGRAMA ES ITERITEMS()

ITERITEMS() nos permite iterar un diccionario. Mas adelante veremos su utilización.

Vamos a empezar a explicar el código.

"""
"abacabad" c
"abacabaabacaba" _
"abcdefghijklmnopqrstuvwxyziflskecznslkjfabe"d"bcccccccccccccyb"y"""

def first_not_repeating_char(char_sequence):
    seen_letters = {}						  # Creamos un diccionario que almacenara una tupla que contendrá dos números

    for idx, letter in enumerate(char_sequence): # Aquí enumerate() nos devuelve un número junto a la letra que recibe en char_sequence
        if letter not in seen_letters:	                   # El número llega a idx y la letra llega a letter
            seen_letters[letter] = (idx, 1)		   # Asignamos una clave y el valor sera una tupla con su valor idx y 1 ya que es la primera vez que aparece
        else:							   # Caso contrario enla linea de abajo agrega una nueva clave en el diccionario y un valor (tupla) 
            seen_letters[letter] = (seen_letters[letter][0], seen_letters[letter][1] + 1)         

# Necesitamos aclarar queenla ultima linea estamos actualizando el valor que corresponde a la clave almacenada por el valor indicado en letter.
# porque lo actualizamos ? debido a que ya el valor se encontraba en el diccionario **seen_letter**
# seen_letters[letter][0] lo anterior corresponde a un indice para el primer valor dela tupla y  seen_letters[letter][1] + 1 corresponde al segundo valor dela # tupla indicado con el indice [1] ahora vemos un + 1 que esta sumando siempre 1 al valor numero ya existente en esa posición.
# Entonces cada vez quese repita una letra sumara 1 a la cuenta. Dándonos el número exacto de repeticiones. 

CONTINUAMOS CON EL ANÁLISIS DEL CÓDIGO

final_letters = []     # declaramos una lista vacía
    for key, value in seen_letters.iteritems():       # Iteramos el diccionario y el key llega la clase (una letra) y en value la tupla
        if value[1] == 1:					  # Si el valor contenido en el indice uno enla tupla es igual a 1. Guarda enla lista final_letters la clave (key) 
            final_letters.append( (key, value[0]) )    # y el valor ubicado en el indice 0. Entonces que esta pasando ? que esta lista se llena con los valores no 	
									  # no repetidos
    not_repeated_letters = sorted(final_letters, key=lambda value: value[1])

    # not_repeated_letters recibe una lista ordenada desde sorted() el orden es respecto a un número, no respecto a la letra. Ese numero si seguiste bien 
    # la ejecución del código notaras que es la cantidad de veces quela encontraste para nuestros efectos es 1.

   # Finalmente retornamos un valor al usuario si encontramos algo siempre vamos a devolver el primer valor que el algoritmo encuentra y quenose repite
    if not_repeated_letters:
        return not_repeated_letters[0][0]
    else:
        return '_'

VOY HACER UNA ACLARATORIA SOBRE not_repeated_letters = sorted(final_letters, key=lambda value: value[1])
para que entiendas que sucede

>>> final_letters = [('a', 1), ('b', 1), ('c', 3)]   # estos son valores random a modo de ejemplo>>> var = sorted(final_letters, key=lambda value: value[1])
>>> var
[('b', 0),  ('a', 1),  ('c', 3)]
>>>

Observa que la salida se organizo respecto al valor numérico y no a la letra de forma ascendente por defecto. Si deseamos hacerlo de forma descendente debemos indicar el tercer parámetro reverse como True.

En Conclusión la clave de este algoritmo es entender el valor idx ya que este nos indica cual es el primer valor no repetido en aparecer.

Escribe tu comentario
+ 2
4
16826Puntos

Lastima el código no quedo como lo pensé =( junto con los comentario.