Technical tests #1 With python
Вставка
- Опубліковано 21 сер 2024
- 🧾 Redes sociales y contacto 🧾
📷 Instagram: / syscursos
📁 GitHub: github.com/sys...
📲 Discord: / discord
📬 Grupo Telegram: t.me/syscursod...
👨🔧 Usuario Telegram: @syscurso
✉ Email : syscurso@gmail.com
🖌 Colaborador de diseño 🖌
📷 Instagram: / glegital
text = "Creo que a veces es la gente de la que nadie espera nada, la que hace cosas que nadie puede imaginar."
def palabras(txt):
txt = txt.lower().replace(",","").replace(".","").split()
dic = {}
for T in txt:
if T in dic:
dic[T] += 1
else:
dic[T] = 1
return dic
print(palabras(text))
Excelente video, sigue con más ejercicios técnicos, muchas gracias!
Muchas gracias por el comentario!! Justo me animaste para hacer otro vídeo de ello :D
Vengo de C, que leguaje tan facil que es python, graicias por la explicacion no sabia que habia tantas funciones ya hechas
Buenas!!
Ya te digo.. Nada que ver con C, eso si, aunque no lo parezca Python está basado en C jaja
Gracias a ti por comentar :D
fuaaa, facilito te salio, aun tengo mucho por revisar, videazo maquina
A tope tio!! Gracias por el comentario :D
Te felicito, excelente video lo hice como lo mas sencillo que pude pero tu explicación de la programación modular justifica todo, ademas que se ve mucho mas ordenado.
Para ordenarlo hay que importar operator y ejecutar lo siguiente:
countedwords_sorted = sorted(countedwords.items(), key=operator.itemgetter(1),reverse=True)
Saludos!
Estupenda solución a lo que propuse al final del video, diferente incluso a lo que había pensado yo.
Muchas gracias por el comentario! :d
Aquí podríamos echar mano de los diccionario comprenhension para ahorrarnos el ultimo ciclo if-else:
diccionario={i:text.count(i) for i in text}
Perfectísimo, mucho más optima tú idea que la expuesta en el vídeo!! Ánimo con ello! Un saludo
hola era lo que buscaba para compensar el mio, que opinas si implemento de esta forma
código:
def modificacion2():
textoModi=text.lower().replace(","," ").replace("."," ").split(" ")
diccionarioD={i:textoModi.count(i) for i in textoModi}
ordenMenorMayor=sorted(diccionarioD.items(),key=lambda item: item[1])
print(ordenMenorMayor)
modificacion2()
disculpa como puedo aprender a usar esa forma el código como el que pusiste ?
Buen video amigo, gracias por compartir tus conocimientos! , sigue así que aportas mucho a esta comunidad:)
Gracias!!! Me alegra de que sirva para algo :)!!
Para ordenar el diccionario por el valor podemos usar la función sorted() junto al método ítems(): dentro de la función countWords
diccionario_ordenado_por_valor = dict(sorted(dictionay.items(), key=lambda item: item[1]))
Y retornamos el diccionario ordenado
Un pequeño apunte, a la función split() no hace falta pasarle como argumento un whitespace, porque llamarla sin nada dentro hace lo mismo, es decir:
texto.split() = texto.split(" ")
Mi resolución fue la siguiente:
def contar_palabras(string):
string = string.replace(",", "")
string = string.replace(".", "")
string = string.lower()
lista_palabras = string.split()
diccionario = {}
for palabra in lista_palabras:
if palabra not in diccionario:
diccionario[palabra] = 1
else:
diccionario[palabra] += 1
return diccionario
Muy similar a la del vídeo, pero solo declaré una función, no se si eso es mejor o peor en términos de rendimiento.
Buen vídeo :)
Hoolaa!!
Buen apunte, toda la razón, quizás es más explícito ponerlo pero perfectamente puede ir como lo mencionas!
Respecto a lo demás, como sale en el video, podrías ahorrarte una línea en los replace que se pueden acoplar entre ellos. De todas maneras, es muy correcta tú solución.
Yendo a la pregunta de 'no se si eso es mejor o peor en términos de rendimiento.'
Lo detallé en un comentario de un compañero abajo, que comentaba que era demasiado código y le comenté los motivos si lo quieres revisar, de todas maneras, a términos de optimización, legibilidad, alta cohesión y bajo acoplamiento(Conceptos que siempre recalco si los buscas te pueden servir a nivel personal y profesional), una función debe de realizar solo una cosa, esa cosa es el nombre de la propia, como resumen!
Lo siento por ser chapas, siempre es bien que se conozcan!
Gracias por el comentario compañero, ánimo con ello!
@@syscursos Ok, muchas gracias por la aclaración! Buen día :)
Primero que nada me gusta este tipo de cosas, porque estan buenas para practicar, y me parece buenisima tu solución, yo lo resolví de otra manera, pero para variar, excepto la parte de hacerlo con expresiones regulares, también pensé en algo similar, lo que si no coincido es en funciones tan pequeñas... de un return directo, por lo menos dos instrucciones, por eso para mi es mejor que tenga una salida de un array limpio y ordenado, pero creo que son opiniones. Gracias por el contenido. Saludos
import re
import operator
text = "Creo que a veces de la gente que nadie espera nada, la que hace cosas que nadie puede imaginar. 22"
def convert_list_clean(text:str)->list:
list_words = re.sub('[^a-z A-Z]', '', text).lower().split(' ')
list_words = sorted(list_words)
return list_words
def countWords(list_words:list)->dict:
dict_words = {word:0 for word in list_words}
for word in list_words:
dict_words[word] += 1
list_sorted = sorted(dict_words.items(), key=operator.itemgetter(1), reverse=True)
dict_words = {k:v for k,v in list_sorted}
return dict_words
list_words = convert_list_clean(text)
result = countWords(list_words)
print(f'El resultado es: {result}')
la salida: El resultado es: {'que': 4, 'la': 2, 'nadie': 2, 'a': 1, 'cosas': 1, 'creo': 1, 'de': 1, 'espera': 1, 'gente': 1, 'hace': 1, 'imaginar': 1, 'nada': 1, 'puede': 1, 'veces': 1}
Hola!! Antes de nada gracias por comentar :D
Es importante que una función haga honor a su nombre y solo lo que representa, esto se hace para que se pueda reutilizar a futuro.
Ejemplo: python tiene la función lower() que seguro la conoces. Esa función por debajo tiene código para que simplemente usandola hagamos la conversión de un texto a minúsculas.
Te entiendo la verdad pero se hace por cosas como esta.
Conceptos que te pueden interesar:
SOLID
Alta cohesión
Bajo acoplamiento
Respecto a tú código, está fantásticamente bien. Me anoto yo cosas y todo! Gracias y ánimo con ello! :D
Saludos
Gracias! esta fue mi manera de resolverlo antes de ver el video, y creo que fue algo similar a lo que hiciste. Saludos!!
text = "Creo que a veces es la gente de la que nadie espera nada, la que hace cosas que nadie puede imaginar. creo"
c = text.lower().split(' ')
d = {}
for pos,char in enumerate(c):
char = char.lower()
if text.lower().find(char):
if char in d:
d[char] +=1
else:
d[char] = 1
print("hay {} palabras, de las cuales las que se repiten son:".format(len(c)))
for pos in d:
if d[pos] > 1:
print("["+pos+"]","aparece",d[pos],"veces")
Muy buenas!! y gracias a ti por el comentario! :D
Te comento si quieres las cosas buenas y las cosas a mejorar que siempre puede estar bien.
A nivel de código, de lógica y estructura está muy bien y cumple la funcionalidad del ejercicio a la perfección así que enhorabuena.
Cositas que quizás te puedan dar más puntos a la hora de una prueba técnica real:
- Los nombres de variables, siempre tienen que representar lo que contienen, es decir, si creas un diccionario especifícalo más, en vez de 'd' pon dic o algo similar, lo mismo con la variable 'c' podrías llamarla cleanedText o similar para que me entiendas. (Es un fallo por lo general de los profesores al enseñar programación, luego en los trabajos no sabes que significa 'c' si un compañero te ha dejado el código hecho)
- Es importante el uso de funciones o métodos en general (en el video usamos funciones) ya que luego puedes reutilizar el código simplemente llamando a la función toLowerCase() del video por ejemplo. Mientras que programándolo sin el uso de las mismas, no podrás reutilizarlo, sino que tendrás que volver a escribir todo el code (importante que se enseñe esto también)
-Esto ya algo propio, mira el format de las últimas versiones que es f'resultado{variable}' bastante más práctico
Siempre comento esto para que se vayan aprendiendo cosillas, mucho ánimo con ello compañero!
Saludos!
@@syscursos Muchísimas gracias por tu orientación, me quedó bastante claro y voy a tomar muy en cuenta tus recomendaciones.
Espero que estés muy bien y muchas gracias de nuevo.
no es por nada demaciado codigo para algo simple: te pongo mi ejemplo donde cadena es todo el texto: lst = cadena.lower().replace(","," ").replace("."," ").split(" ")
print({i:lst.count(i) for i in lst})
saludo tio
Hoola!! Muy bien pensado y buenas líneas de código!
Lo que aquí te dejo algún consejo! Es probable que una empresa se decantase por 'el demasiado código' y te detallo el motivo a tener en cuenta:
Lo que se busca en la programación modular es poder reutilizar el código, es decir, si en algún otro programa por ejemplo, necesito cambiar un texto a lower solo necesitaré llamar a esa función y ya está, si por ejemplo en otro programa externo tengo que realizar el mismo procedimiento, simplemente llamo a las 3 funciones y listo, mientras tú tendrás que reescribir el mismo código una y otra vez, siendo solo útil para esa tarea especifica y no de manera modular. También a tener en cuenta la alta cohesión y el bajo acoplamiento. Son conceptos importantes en la industria si quieres tener un código más legible y reutilizable. Gracias por compartir tú idea que me ha gustado!
Saludos!
disculpa que signica o represaenta esos : soy nuevo y busco la manera de que el codigo sea lo mas corto y legible me podrias orientar
@@jonmaz9 como es un diccionario los dos punto es la separacion entre la llave i y su valor lst.count(i) en la practica es i = a una palabra y lst.count(i) numero de veces que aparece la misma palabra. Saludos
@@sacrac1 muchas gracias
Comparto mi codigo (comentado), me encantaria si te tomas el tiempo y me das feedback.
En vez de haccer un diccionario, utilizo un set, ya que asi el numero de iteraciones en el bucle for seria menor, ya que no se repitirian elementos. Saludos
text=input('Ingrese el texto: ')
#antes de nada, normalizamos el texto, convirtiendolo todo a minusculas, para evitar que el programa detecte mayusculas
text=text.lower()
#luego eliminamos las comas, puntos, y signos en caso existan, esto lo haremos con un bucle for
caracteres= [',','.',':','.',';','!','?'] #Esta lista puede ampliarse para todos los caracteres posibles que se usen, he usado los mas comunes
for caracter in caracteres:
text=text.replace(caracter,'')
#Ahora lo dividimos en cada palabra y lo colocamos en una lista
list=text.split()
#Establecemos una set donde tengamos todos los elementos pero no se repitan
set=set(list)
#con un bucle, contamos cuantas veces aparece cada elemento del set, en la lista y asi obtendremos el problema resuelto
for palabra in set:
x=list.count(palabra)
print(f'La palabra "{palabra}" aparece {x} veces en el texto proporcionado')
Hola!!
En primer lugar gracias por comentar y disculpa la tardanza que he estado fuera!
Me gusta mucho el código, aunque como siempre digo debería ir separado en funciones, que veo que no las has creado!
Muy bien el uso del set y lo del replace con la lista de dichos caracteres me gusta mucho :d
Luego lo de comentarlo todo estupendo, siempre se debería de comentar el código!
Cositas a mejorar quizás, el último print como sean muuchas palabras, se va a repetir x100 la frase o lo que sea, va a colapsar la consola, por lo tanto recomendaría mostrar una lista como dato final o similar!
Luego que las variables, sigan un lenguaje concreto, o inglés o español!
Muuchas gracias y ánimo!! Saludoss
Después de varios intentos, soy fanático de compactar el código.
text = "Creo que a veces es la gente de la que nadie espera nada, la que hace cosas que nadie puede imaginar."
separedText = text.lower().replace(",","").replace(".","").split()
wcount = {word: separedText.count(word) for word in separedText}
print(dict(sorted(wcount.items(), key=lambda x: x[1], reverse=True)))
Muy buenas!!
Tengo que decir que ha quedado bien resumido y en muy poquitas líneas, por esa parte estupendo! Lo que recuerda que compactar el código a largo plazo puede ser contraproducente!
Gracias por comentar :D
@@syscursos si, lo he notado, cuando el código no está tan compactado se hace fácil a simple vista saber que hace esa parte del código, me ha pasado ver código de compañeros y tener que preguntarle que función cumple un segmento. Mas que nada cuando entras a anidar con lambda
Gracias!
Buenisimo
Gracias
Buen Video. Muchas Gracias !
Comparto mi solución.(me faltó reemplazar "." y "," por espacios 😞 y le cambié el texto predefinido por un input que el usuario lo ingrese a su gusto)
def principal():
text=str(input("ingresa el texto que quieres que cuenta palabras repetidas :"))
qty(text)
print("
Gracias por utilizar el Servicio de Conteo !")
def qty(text):
text=text.lower()
split=text.split()
list2=[ ]
for i in split:
if i not in list2:
list2.append(i)
for i in range(0,len(list2)):
print("the Qty of:",list2[i],"- is: ",text.count(list2[i]))
if __name__=="__main__":
principal()
Gracias a ti Sebas por comentarlo!
He encontrado un pequeño bug en el código, si quieres ver de solventarlo y comentarlo de nuevo te leo!
El bug es el siguiente: Si por ejemplo pones la frase que aparece en el video 'Creo que a veces es la gente de la que nadie espera nada, la que hace cos
as que nadie puede imaginar'.
Como verás el texto tiene una 'a' individual, cuando tú código obtiene una letra individual, empieza a contar esa letra en cada palabra. Por lo tanto en ese texto obtenemos 16 'a', cuando realmente solo aparece una. (Ocurrirá lo mismo con cada letra individual en una frase.)
Quitando eso, solo cambiaría 'principal()' por main(), ya que si utilizas ingles todo debe de ser ingles
Te ánimo a solventarlo, si no hubiese ocurrido eso, tú código sería literalmente Excelente.
Saludos compañero!
Buenas!! Yo lo he resuelto así, pero es que desde mi ignorancia, no comprendo porque es bueno hacer una función para aplicar un método tan corto como puede ser .lower, ya que si lo necesitas luego, es muy poco código como para reutilizar una función no?(si me puedes resolver esto genial jeje) En mi caso lo he resuelto con una sola función entendiendo que quieres poder usarla siempre para ese caso aunque cambie el texto
import operator
text="Creo que a veces es la gente de la que nadie espera nada, la que hace cosas que nadie puede imaginar."
def wordCount(texto):
texto=text.lower().replace(","," ").replace("."," ").split()
textDicc={}
for i in set(texto):
textDicc[i]=texto.count(i)
textOrd=sorted((textDicc.items)(), key=operator.itemgetter(1))
print(textOrd)
wordCount(text)
Hoola de nuevo Carlos!!
En este caso vamos a ver unas cosillas de mejora que siempre es bueno conocerlas, sobre todo por ti y por quien pueda leer el comentario! :D
En primer lugar te respondo a lo de porque es bueno crear funciones varias y que que representen algo concreto, digamos que la magia o la base de la programación es poder reutilizar lo que ya tienes, por lo que, si de repente en tu proyecto tienes que reutilizar una función que tiene que contar las palabras de un texto, pero justamente en ese caso no tienes que limpiar el texto ni convertirlo a minúscula, tu método ya no es viable para poderlo reutilizar en otro caso diferente, así que tendrías que reescribir uno nuevo, mientras que si lo tienes por separado, uepa! Podrías utilizar solo countWords() y no tendrías que hacer nada más. Vamos a poner otro caso, que tuvieses que convertirlo a Upper y sin limpiarlo, pues podrías simplemente llamar a otro método toUpper() y countWords() y ya estaría, sin necesidad de escribir nada más de código. Esta es la base de: Alta cohesión y bajo acoplamiento en diseño de software(La cohesión es la medida en la que un componente o clase realiza únicamente la tarea para la cual fue diseñada (Una clase debe de hacer lo que respecta a su entidad, y no hacer acciones que involucren a otra clase o entidad).) No sé si me he explicado, pero una vez se entiende esto.. Se gana mucho.
El código me parece muy chulo, el uso del set y el recuento es perfecto! Luego que me parece que utilizas bien el lenguaje y sus librerías, ese operator :D De hecho has resuelto la tarea que puse en el 10:38 de ordenar el resultado jajaja Great!!
Y por último te dejo el código un poquito modificado para que se vean unas cositas:
En tú code utilizabas la variable text externa y no la recibida por parámetro (por eso le cambie el nombre), y luego que en una función por lo general debes de devolver algo y luego hacer un print en todo caso! Quitando eso poco más, creo que lo verás claro con el código que he puesto! De todas formas cualquier duda aquí estoy!
import operator
def wordCount(text):
cleanedtext = text.lower().replace(","," ").replace("."," ").split()
textDicc={}
for i in set(cleanedtext):
textDicc[i]=cleanedtext.count(i)
textOrd=sorted((textDicc.items)(), key=operator.itemgetter(1))
return textOrd
textParam="Creo que a veces es la gente de la que nadie espera nada, la que hace cosas que nadie puede imaginar."
wordCountResult = wordCount(textParam)
print(wordCountResult)
@@syscursos Muchas gracias, no había pensado en la posibilidad de utilizar otras partes del código, más bien me centre en el uso de todo como conjunto, seguiré trabajando en esa parte de mi pensamiento. En un rato me pondré con detenimiento a ver el código que me has enviado, mil gracias por tu tiempo!!
PD. a mi cuando me ponen tarea, la hago jajaja (min 10:38)
print(Counter(text.lower().split())
Me gusto mucho el ejercicio dejo aquí mi solución para ver que te parece y si puedes hacerme alguna correccion, te daria un beso grandisimo.
def text_cleaned(text):
return text.lower().replace(',', '').replace('.', '').split()
def words_count(text):
dict1 = {}
words = text_cleaned(text)
for word in set(list(words)):
dict1[word] = words.count(word)
return dict1
print(words_count(text)
Holaa!! Gracias por comentar antes de nada :D
Sinceramente la mejor solución por el momento, incluso la función words_count supera por creces a la del video, enhorabuena!!
Solo algún apunte pero por comentar algo e ir a la perfección:
- return text.lower().replace(',', '').replace('.', '').split() Yo quizás lo pondría en una variable dentro de la función y devolvería la variable, por estructura más que nada.
- La función text_claned ,ya es por mera reflexión.. ¿Se puede considerar que limpiar un texto también es convertirlo a minúscula?
Quitando eso, que ya puede ser por gustos, todo esta estupendamente bien.
Graciass!!
@@syscursos gracias por responder, la verdad todos esos apuntes que me diste, son más importantes que nada, ahora tiene lógica el tener funciones separadas con nombres que representen lo que hacen. El concepto de reutilización es lo más poderoso que hay, pero es complejo para los noobish como yo aún llegar a ese nivel de sencillez y legibilidad. Tienes más ejercicios, estoy ansiosa de hacer más.
El concepto de reutilización es esencial como dices, de hecho al ver que te interesas te dejo conceptos a tener en cuenta: 'KISS', 'DRY', SOLID... Y otros de los que hablábamos de reutilizable, legible, etc.. : 'Alta cohesión' y 'Bajo acoplamiento'. Creo que te pueden servir por el ritmo que llevas :D. Ánimo con ello.
PD: Hay un total de 3 pruebas técnicas en el canal y hoy o mañana subiré una que es más compleja!
Un saludo y gracias!
hola dejo mi código:
def modificacion():
textoModi=text.lower().replace(","," ").replace("."," ").split(" ")
diccionarioD={}
for numerar in textoModi:
if numerar in diccionarioD:
diccionarioD[numerar]+=1
else:
diccionarioD[numerar]=1
ordenMenorMayor=sorted(diccionarioD.items(),key=lambda item: item[1])
print(ordenMenorMayor)
modificacion()
que opinas?, lo de poner las numeración en orden investigue
Muy buenas!!
Antes de nada gracias por el comentario y tu solución!
El ejercicio cumple con lo que se pide y es funcional, enhorabuena! :D
Si quieres podemos ver ciertas cosas que se pueden mejorar, siempre para el avance de vosotros mismos:
-Una función debería de devolver algo y no mostrarlo por consola por lo que debería ser return ordenMenorMayor y luego fuera poner print(modificacion() y nunca esta de más crear una variable por ejemplo: modificacionUno = modificacion() y luego print(modificacionUno)
-Sinceramente los nombres de variables están muy bien, son descriptivos, lo único que si se puede empezar a codificar en ingles desde el principio mejor créeme!
-Hay un muy pequeño bug, al reemplazar las ',' y los '.' has puesto el replace con un espacio y debería ser sin espacio, que luego hará recuento de los espacios y aparecen al finalizar ('', 2)
-Ahora lo que comento siempre y en otros comentarios, es importante respetar la alta cohesión y bajo acoplamiento, es decir, que cada función haga una cosa y no muchas a la vez, por legibilidad, sostenibilidad, modularidad y muchas cositas más. Por lo tanto, si tú te preguntas.. ¿Qué hace mi función? Te darás cuentas que limpia, ordena, y enumera palabras... No hace una cosa en concreto, hace 3 o 4. No tengas prisa con tener menos líneas y tener que repetir el código 100 veces, mira de tener más líneas y poderlo reutilizar 100 veces.
Para terminar los nombres de las variables son buenos... Buenísima investigación eres de los pocos que ha completado la ordenación que pedía al final del video y el código está estupendo y funcional, ahora solo faltan los matices
Graciaass de nuevo y mucho ánimo, espero que te sirvan los consejillos
@@syscursos muchas gracias, si coloque return y al final print(modificacion) pero quise ver tu opinión en eso ya que no lo vi aplicado y me quede en dudas si si funciona, el espacio tienes razon se me pega esa mala practica que en los espacios libres doy un espacio, muchas gracias tomare el consejo
Lo hice en 5 lineas 😳
Fantástico!! Siempre se aprende cuando lo hace uno mismo