Facebook Google+


Ejercicios Python con cadenas
#1
Ayuda con estos ejercicios no les entiendi a lo de las cadenas y eso son 3 no se como empezar
no tengo idea de las subcadenas en python.    Sad Sad Sad

ejercicio 1. dada una lista de cadenas, devuelva la cadena más larga. Si dos o más
cadenas miden lo mismo y son las más largas, la función devolverá una cualquiera de ellas.



ejercicio 2.   Necesito que reciba una lista de cadenas y devuelva el prefijo común más largo.




ejercicio 3.   Que lea una cadena y un entero k, y muestre todas las subcadenas de
longitud k.
 
#2
Seguro que sí puedes sacarlos. Vamos a probar.
Ejercicio 1. ¿Qué has entendido del enunciado?
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
#3
Pues si.... deberias plantear algo amigo Angel sino ya seria hacerte las tareas Big Grin
 
#4
no entiendo lo de las cadenas por eso pido ayuda
 
#5
Una cadena es la traduccion de "string" (cadena en ingles) y se llaman asi porque los caracteres (letras, numeros y simbolos ASCII) vienen encadenados o encolumnados unos detras de otros. Puedes ver un string o cadena como un arreglo (estático) de caracteres.

Arriba dije estático porque en realidad cuando modificas una cadena en Python estas creando otra nueva (mas corta, mas larga o con algun cambio pues) y asociandola a la misma variable. La primera cadena sigue en memoria hasta que un proceso de limieza (llamado GC) la limpia de memoria.
 
#6
Código:
del ejercicio 1 tengo esto

def e1():
    ct=[]
    cac=int(input("Cuantos cadenas quieres crear: "))
    for i in range(0,cac):
        print("Insertar datos en la cadena",i,"separados por comillas")
        nc1=input()
        ct.insert((i),(nc1))
    print(ct)

lo q q no se, es de una lista sacar sublistas y de hay poder sacar la mayor de las sublistas q hay en la lista

Enmarca tu código entre las etiquetas [code] y [/code]
 
#7
Lo que entiendo es que quieres saber cual es el string de mayor longitud, tu hablas de sublistas pero no veo que crees una estructura distinta a una lista (no creas listas de listas por asi decirlo que seria un arbol)

Es asi ? de ser asi debes recorrer toda la lista e ir actualizando un contador llamemoslo "maximo" y un string llamemsolo "stringMasLargo".

Investiga sobre como encontrar maximos y minimos en funciones, sino puedes postea lo que has hecho.


PD: @MAFUS gracias por la edición Wink
 
#8
exacto quiero saber cual es el string de longitud mayor, pero entonces necesitaría tener listas separadas y así obtener la lista mayor de las listas creadas.
 
#9
Código:
lista=["hardforo.com","stackoverflow.com","lawebdelprogramador.com","elhacker.net"]

maximo = 0
stringMasLargo=""
i=0
while(i<len(lista)):
  if (len(lista[i])>maximo):
      maximo=len(lista[i])
      stringMasLargo = lista[i]
  i+=1

print("String mas largo es: "+stringMasLargo)

O como funcion:

Código:
def maxStr(lista):
  maximo = 0
  stringMasLargo=""
  i=0
  while(i<len(lista)):
    if (len(lista[i])>maximo):
        maximo=len(lista[i])
        stringMasLargo = lista[i]
    i+=1
  print (stringMasLargo)  
  stringMasLargo # return
 
#10
def e1():
ct=[]
cac=int(input("Cuantas cadenas quieres crear: "))
for i in range(0,cac):
ct.append(input("Insertar datos en la cadena:\n"))
lst=ct
print("La cadena mas larga es:",max(ct))


lo intente hacer asi pero no me sale, como me puede salir ayuda
 
#11
Una cosa que no me explico es lo de "separados por comillas", como es que quieres que se ingresen los datosa ? si es que van a ingresar asi:

"pablo","maria","miquel","andres"

Entonces deberias hacer UN solo raw_input() y luego separar los substrings que constituirian tu lista
 
#12
eso es lo que no entiendo en el ejercicio, si pongo un input() para insertar un dato en la cadena pero sin poner comillas por ejemplo:

Insertar datos en la cadena:
angel pedro juan miguel orlando etc..
sin poner nada, los tomara como nombres separados?
(angel,pedro,juan,miguel,orlando)
o tengo a fuerzas hacer q el usuario ponga las comillas al insertar los datos?
 
#13
Esas no son comillas(" o '), son comas (,) y si ... si lo quieres de ese modo debes hacer un "split" de la cadena

https://docs.python.org/3/library/stdtyp...#str.split
 
#14
aun no me sale, me manda esto:
pseudocodigo:

Código:
def e1():
    try:
        ct=[]
        cac=int(input("Cuantas cadenas quieres crear: "))
        if(cac < 0):
          print("Ingresastes un numero engativo")
          return e1()
        if(cac > 101):
          print("Ingresastes un numero mayor")
          return e1()
    except:
        print("Error...")
        return e1()
    for i in range(0,cac):
        ct.append(input("Insertar datos en la cadena con con comilla:\n"))
        lista=[ct]
    print("La cadena mas larga es:",max(lista))

ejecutado:

Cuantas cadenas quieres crear: 2
Insertar datos en la cadena con con comilla:
angel,miguel
Insertar datos en la cadena con con comilla:
alfredo
La cadena mas larga es: ['angel,miguel', 'alfredo']

y lo que quiero q me mande es la mayor cadena que seria los nombres angel y miguel porque serian 2 datos en una cadena y me manda la cadena completa
como puedo hacer eso?
 
#15
Cita:y lo que quiero q me mande es la mayor cadena que seria los nombres angel y miguel porque serian 2 datos en una cadena y me manda la cadena completa
como puedo hacer eso?

Nuevamente separando la cadena con Split()

https://docs.python.org/3/library/stdtyp...#str.split
 
#16
entiendo pero donde puedo meter ese split() amigo master
 
#17
Para empezar la cantidad de comas determina cuantas subcadenas tienes, asi que no deberias preguntar cuantas se van a ingresar:

Cita:lucas,tito,esteban

Son 2 comas, 3 nombres o en general, hay (comas+1) subcadenas, por tanto se simplifica en realidad la parte del ingreso a un solo input o raw_input a solo 1 y luego un Split() sobre la variable.
 
#18
no tiendo el split Sad soy novato
 
#19
amigos creo q ya me salio gracias por su apoyo.

pseudocodigo:

def e1():
try:
ct=[]
cac=int(input("Cuantas cadenas quieres crear: "))
if(cac < 0):
print("Error, no insertar numeros negativos")
return e1()
if(cac > 101):
print("Error, numero demasiado alto")
return e1()
except:
print("Error...")
return e1()
for i in range(cac):
ct.append(input("Insertar datos en la cadena:\n"))
lista=ct
mxm = 0
lg=""
i= 0
while(i<len(lista)):
if(len(lista[i])>mxm):
mxm=len(lista[i])
lg = lista[i]
i+=1
print("La cadena mas larga es:"+lg)
print("")
return e1()



ahora hacer el ejercicio 3, alguna sugerencia las acepto.
 
#20
Me alegro Big Grin
 
#21
sugerencias de como empezar el ejercicio 3, me ayudarían mucho
 
#22
Para hacer que una función empiece de nuevo usa bucles. No debes hacer nunca recursividad si no es absolutamente necesario por la razón de que llenas la memoria de pila innecesariamente.
Si la lógica está bien deberías reestructurar el código para trabajar en un bucle.
Te recomendaría que la función únicamente hiciese el trabajo que debe hacer e indicar si ha habido un fallo en caso de producirse uno. La idea es que sea el llamador el que se encargue de tratar el error, si ha habido alguno y de llamar a la función de nuevo si fuera necesario.

Si separas bien el código por responsabilidades, en un futuro y cuándo tu código crezca, podrás encontrar más facilmente los errores y seguir tus fuentes. Es una recomendación a la que te invito que le cojas costumbre cuanto más pronto mejor.
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
#23
amigo MAFUS gracias por el consejo, lo tomare en cuenta. mas o menos le estoy entendiendo a esto de python. slds

amigos, como puedo hacer q de una cadena, muestre todas las subcadenas. entonces hay seria con un set(). o como seria sugerencias

 
#24
como puedo hacer el ejercicio 3 amigos sugerencias,
solo tengo en mente de q tiene q pedir la cadena
pero como hare q de esa cadena me de la subcadena
ayuuuuda
 
#25
He visto que para sacar una subcadena de una cadena basta con hacer str[inicio:fin];
siendo str la variable de la cadena
inicio el índice de inicio de la subcadena
fin el índice de fin de la subcadena
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
#26
pero entonces como puedo hacer que lea la cadena y el entero y q el entero tenga la subcadena
eso es lo q no entendi
 
#27
tengo entendido q los enteros son los q ingresas a la cadena pero, lo q no entiendo es como obtener una subcadena de un entero de esa cadena
 
#28
Código:
c=input("Dame la cadena: ")
print(set(c))
c = c[0:c+LENGTH]
print(c)

que mas puedo hacer del ejercicio 3 ya no se
 
#29
Tengo la impresión de que te estás saltando temas en tu estudio de Python y avanzas a trompicones.
input no es la función que buscas ya que se evalúa la entrada. Para hacer lo que quieres debes usar raw_input.
Tienes un error muy grave con el uso de variables.
Si haces:
Código:
c = c[0:c+LENGTH]
estás machacando c, tu cadena de entrada por la subcadena. Pierdes la información.

Por otra parte deberías meter el código que crea la subcadena en un bucle para que vaya avanzando letra a letra en la cadena original y así sacando todas las subcadenas de tamaño LENGTH que hay en ella.

Algo así:
Obtienes la cadena en c
Bucle en i desde 0 hasta longitud de c menos LENGTH más uno
Imprimes c desde i hasta i más 3
Fin de Bucle
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
#30
asi es amigo MAFUS yo tbm me estoy dando cuenta de eso, lo que pasa que el profe no explika sobre los temas basados en los ejercicios y uno tiene q investigar por su parte y si no los haces pelas.
pero gracias por la ayuda de todos.
 
#31
asi es amigo MAFUS yo tbm me estoy dando cuenta de eso, lo que pasa que el profe no explika sobre los temas basados en los ejercicios y uno tiene q investigar por su parte


Eso SIEMPRE es asi amigo, toca pelearla bastante porque no podemos preguntar todo Big Grin te recomiendo te leas un libro de Python y de paso podras aportar algo interesante en el foro.
 
#32
ayuda me da error, que puedo cambiar para que me de el prefijo común mas largo.

adjunto el pseudocodigo:

Código:
def prefijo(lista):
    for i in range(len(lista)):
        palabra=lista[i]
        palabra2=lista[i+1]
        pref=""
        z=0
        if len(palabra)<len(palabra2):
            while z<=(len(palabra2)):
                if palabra2[z]==palabra[z]:
                    pref +=palabra[z]
                    z +=1
            return(pref)
        else:
            j=0
            while j<=(len(palabra)):
                if palabra2[j]==palabra[j]:
                    pref +=palabra2[j]
                    j +=1
                
            return(pref)
                
lista=["poliedro","policia","polifonia","polinizar","polaridad","politica"]
print(prefijo(lista))
 
#33
Te voy a hacer un regalo. Con lo poco que sé de python y adaptándolo a mis conocimientos de C te he escrito el siguiente código.
Lo dicho, está en estilo de C, seguro que un programador de python lo hubiera hecho mejor.
Código:
def prefijo(lista):
    if type(lista) is list and len(lista) > 0: #compruebo si la variable pasada es una lista y que esta no está vacía
        retval = lista[0] # el valor de retorno será la primera palabra
        final = len(retval) # la longitud máxima del final es el tamaño de la palabra de retorno
        for palabra in lista: # por cada palabra en la lista, por comodidad incluyo la primera
            for i in range(len(palabra) if len(palabra) < final else final): # bucle desde 0 hasta el tamaño de la palabra
                                                                             # o de la variable final, lo que sea más corto
                if retval[i] != palabra[i]: # voy comprobando si las letras de retval y la de la palabra actual del bucle
                                            # son diferentes. Si lo son:
                    if(i < final): # Compruebo si el indice en el que me encuentro actualmente es menor a final
                        final = i # si el indice es menor hago que final adquiera el valor de indice
                    break # y termino el bucle, ya no hace falta seguir buscando más
        return retval[0:final] # una vez comprobadas todas las palabras devuelvo la subcadena realizada por la primera
                               # palabra desde 0 hasta el indice marcado por final
    else: # si la variable no es una lista o su longitud es 0
        return None # devuelvo un valor con el que podré saber que ha habido un error
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
#34
Buena respuesta @MAFUS, hoy ando complicadísimo voy a ver si mañana lo hago por mi lado.
 
#35
Adjunto los ejercicios creados para alguien le pueden servir
viene con una ventana emulada en CMD

codigo:

Código:
from colorama import *
import os
import time
import itertools

init(autoreset=True)
global c
c=0

def menu():
    global c
    try:
        for i in range(100):
            print(Cursor.POS(23,1)+Back.GREEN+Fore.LIGHTWHITE_EX+"                              ")
            print(Cursor.POS(23,2)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(23,3)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(23,4)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(23,5)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(23,6)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(23,7)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(23,8)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(23,9)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(23,10)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(23,11)+Back.GREEN+Fore.LIGHTWHITE_EX+"                              ")
            print(Cursor.POS(51,2)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(51,3)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(51,4)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(51,5)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(51,5)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(51,6)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(51,7)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(51,8)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(51,9)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(51,10)+Back.GREEN+Fore.LIGHTWHITE_EX+"  ")
            print(Cursor.POS(25,2)+Back.CYAN+Fore.LIGHTYELLOW_EX+"                          ")
            print(Cursor.POS(25,3)+Back.CYAN+Fore.LIGHTGREEN_EX+"  d03-p11-angel-renteria  ")
            print(Cursor.POS(25,4)+Back.CYAN+Fore.LIGHTBLUE_EX+"  Horario: 13:00-17:00    ")
            print(Cursor.POS(25,5)+Back.CYAN+Fore.LIGHTYELLOW_EX+"  Ejercicio 1:            ")
            print(Cursor.POS(25,6)+Back.CYAN+Fore.LIGHTYELLOW_EX+"  Ejercicio 2:            ")
            print(Cursor.POS(25,7)+Back.CYAN+Fore.LIGHTYELLOW_EX+"  Ejercicio 3:            ")
            print(Cursor.POS(25,8)+Back.CYAN+Fore.LIGHTYELLOW_EX+"  Ejercicio 4:            ")
            print(Cursor.POS(25,9)+Back.CYAN+Fore.LIGHTYELLOW_EX+"  Salir 5:                ")
            print(Cursor.POS(25,10)+Back.CYAN+Fore.LIGHTYELLOW_EX+"                          ")
            print("")
            print("")
            print("Contador de errores: ",c)
            print("")
            n=str(input("denota numero de ejercicio: "))
            if(n==str(1)):
                return e1()
            elif(n==str(2)):
                return e2()
            if(n==str(3)):
                return e3()
            if(n==str(4)):
                return e4()
            if(n==str(5)):
                print("Saliendo...")
                quit()
            else:
                print("Opcion erronea")
                c=c+1
                time.sleep(1)
                os.system('cls')
    except:
        c=c+1
        time.sleep(1)
        os.system('cls')

        
def e1(): # Programa de la lista de nombres.
    global c
    os.system('cls')
    try:
        nombresL=[]
        print("Presiona 0 para salir al menu")
        n=int(input("Cuantos nombres va a tener la lista: "))
        if(n < 0):
            print("Error, no se aceptan negativos")
            time.sleep(1)
            c=c+1
            return e1()
        elif(n > 150):
            print("Error, muchos numeros insertados")
            time.sleep(1)
            c=c+1
            return e1()    
    except:
        print("Fuera de rango")
        time.sleep(1)
        c=c+1
        return e1()
    if(n==0):
        os.system('cls')
        return menu()
    for i in range (n):
        nombresL.append(input("Nombre: ".format(i)))
    lista=nombresL
    letra=input("Dame la letra: ")[0]
    print("")
    print("Nombres con %s\n " %letra)
    for i in range(len(lista)):
            if(lista[i].startswith(letra)):
                print(lista[i])
                time.sleep(4)
    return e1()


def e2(): # Programa de las cadenas.
    global c
    os.system('cls')
    try:
        ct=[]
        print("Presiona 0 para salir")
        cac=int(input("Cuantas cadenas quieres crear: "))
        if(cac < 0):
            print("Error, no insertar numeros negativos")
            time.sleep(1)
            c=c+1
            return e2()
        if(cac > 101):
            print("Error, numero demasiado alto")
            time.sleep(1)
            c=c+1
            return e2()
    except:
        print("Error...")
        time.sleep(1)
        c=c+1
        return e2()
    if(cac==0):
        print("Saliendo...")
        time.sleep(1)
        os.system('cls')
        return menu()
    for i in range(cac):
        ct.append(input("Insertar datos en la cadena:\n"))
        lista=ct
    print(set(lista))
    mxm = 0
    lg=""
    i= 0
    print("")
    while(i<len(lista)):
        if(len(lista[i])>mxm):
            mxm=len(lista[i])
            lg = lista[i]
            print("")
        i+=1
    print("La cadena mas larga es: ",lg)
    time.sleep(4)
    os.system('cls')
    return e2()

def e3(): # Programa de los prefijos.
    global c
    os.system('cls')
    print("Presione 0 para salir al menu")
    print("")
    S=input("Dame la primera cadena: ")
    if(S=='0'):
        print("Saliendo al menu")
        time.sleep(1)
        os.system('cls')
        return menu()
    T=input("Dame la segunda cadena: ")
    m = len(S)
    n = len(T)
    contador = [[0]*(n+1) for x in range(m+1)]
    largo = 0
    lcs_set = set()
    for i in range(m):
        for j in range(n):
            if S[i] == T[j]:
                c = contador[i][j] + 1
                contador[i+1][j+1] = c
                if c > largo:
                    lcs_set = set()
                    largo = c
                    lcs_set.add(S[i-c+1:i+1])
                elif c == largo:
                    lcs_set.add(S[i-c+1:i+1])
    if (lcs_set == set()):
        print("No hay subcadenas")
        c=c+1
        time.sleep(2)
        return e3()
    print("")
    print("Esta es la subcadena mas larga: ",lcs_set)
    time.sleep(4)
    os.system('cls')
    return e3()

def e4(): # Programa de las subcadenas.
    global c
    os.system('cls')
    print("Presione 0 para salir al menu")
    s=list(input("Ingresa la cadena: "))
    if(s==['0']):
        print("Saliendo al menu.")
        time.sleep(2)
        os.system('cls')
        return menu()
    try:
        k=int(input("Ingresa el numero de elementos de la subcadena: "))
        if(k > len(s)):
            print("no es posible")
            time.sleep(2)
            c=c+1
            return e4()
        x=list(itertools.combinations(s,k))
        x1=len(x)
        print("")
        print("Estas son las subcadenas: ",x)
        time.sleep(4)
        
    except:
        print("Error...")
        c=c+1
        time.sleep(2)
        return e4()
menu()
input()

Saludos a todos por la ayuda.
 
#36
Excelente, nos alegramos de que hayas solucionado y muy bien que hayas compartido el resultado final Wink
 
#37
asi es aporto algo de lo mucho q me ayudaron, saludos a todos
 
#38
Crea un hilo nuevo si la duda es diferente.
CUÁNDO C Y ASM UNEN SUS FUERZAS
TODA RESISTENCIA ES FÚTIL

[Imagen: 1479845315_VVrfgqsvpY2gQJz.jpg]
 
#39
Cierto, debes crear un nuevo hilo y el titulo debe describir el nuevo problema que tienes.

Proceso a dividir y cerrar este tema
 
  


Salto de foro:


Browsing: 1 invitado(s)