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.
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:
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.
Lastima el código no quedo como lo pensé =( junto con los comentario.