Увеличивать список класса в python на escribe

#lista de clases

class Persona():
__nombre=""#los guiones son para que sea un atributo privado
__apellido=""

def setNombre(self,nom):
    self.__nombre=nom
def setApellido(self,ape):
    self.__apellido=ape
def getNombre(self):
    return self.__nombre
def getApellido(self):
    return self.__apellido

print ("Tamanio de la lista: ")
n=int(input())
print("\n")

lista=[None]*n

for x in range(n):
    lista[x]=Persona()
    print("Ingrese Nombre:")
    lista[x].setNombre(input())
    print("Ingrese Apellido:")
    lista[x].setApellido(input())
    print("\n")

print("Quiere agrandar la lista?: s/n")
op=input()

if op=="s" or op=="S":
    print ("cantidad a agregar: ")
    n2=int(input())
    aux=n+n2
    for x in range(n2):
        lista.append(None)
        lista[x]=Persona()
        print("Ingrese Nombre:")
        lista[x].setNombre(input())
        print("Ingrese Apellido:")
        lista[x].setApellido(input())
        print("\n")

for x in range(aux):
    print("\nEn la posicion %d:" % x)
    print(lista[x].getNombre())
    print(lista[x].getApellido())   
#Me sobre escribe los datos de la lista, se que con append
#se escriben al final pero luego me dice 'list index out of range'
else:
    for x in range(n):
        print("\nEn la posicion %d:" % x)
        print(lista[x].getNombre())
        print(lista[x].getApellido())
1
задан 21.03.2019, 10:51
2 ответа

Ты мог бы решать это следующей формы, в линиях:

lista.append(None)
lista[x]=Persona()
print("Ingrese Nombre:")
lista[x].setNombre(input())
print("Ingrese Apellido:")
lista[x].setApellido(input())
print("\n")

remplazas поэтому:

lista.append(Persona())
print("Ingrese Nombre:")
lista[x+n].setNombre(input())
print("Ingrese Apellido:")
lista[x+n].setApellido(input())
print("\n")

Надеялся, что он подает тебе

0
ответ дан 02.12.2019, 05:21

Как ранги - dinГЎmicos я предлагаю работать с циклом while asГ - podrГЎ конфигурировать лучше tamaГ±o и секции списков, которые должны брать и, которые должны использовать в этом случае break не один return, чтобы продолжать потом с вопросом Вїquieres расширять список?

TambiГ©n включать мне казаться подходящим, один pequeГ±o повлек за собой в конце концов, что позволил использовать их mГ©todos getNombre и getApellido из Класса Persona, чтобы проверять вошедшие данные.

Adicionalmente необходимо добавлять один def __init__(self): под class Persona(): для того, чтобы оно функционировало правильно.

cГіdigo quedarГ - в asГ - с Ваш соответствующие

#----------------------------
# variable de inicio
# para ejecutar la
# funcion main
#----------------------------
__main__ = "main"



#----------------------------
# Clase Persona
#----------------------------
class Persona():

  def __init__(self):
        self.__nombre=""#los guiones son para que sea un atributo privado
        self.__apellido=""

  def setNombre(self,nom): self.__nombre=nom
  def setApellido(self,ape): self.__apellido=ape

  def getNombre(self): return self.__nombre
  def getApellido(self): return self.__apellido


#----------------------------
# funcion de ayuda 
# para crear lista   
#----------------------------
def crearLista(lista, n):
    end=len(lista)+n-1  # las listas empiezan en cero

    i=len(lista) # si se le llama más de una vez
                 # se garantiza que no se sobreescriba los objetos

    while (True):
        if (i>end): 
            break # se sale del bucle while
        else:
            # se agrega a la lista
            # por lo menos un elemento
            lista.append(Persona())

            #------------------------------------------
            # notese que se escribe en una lista
            # que ya tiene por lo menos un elemento (objeto)
            # entonces al usar len(lista)
            # en el caso inicial será uno (1)
            # pero Python empieza a indexar las listas
            # a partir de cero (0), en tal sentido
            # se emplea la expresion len(lista)-1
            #------------------------------------------
            print("Ingrese Nombre:")
            lista[len(lista)-1].setNombre(input())

            print("Ingrese Apellido:")
            lista[len(lista)-1].setApellido(input())

            print("\n")
            i+=1 # se actualiza contador
            #------------------------------------------


    print("Quiere agrandar la lista?: s/n")
    op=input()

    #------------------------------------------
    # en caso sea 's' o 'S'
    # se llama de nuevo a crearLista
    #------------------------------------------
    if op=="s" or op=="S":
        print ("cantidad a agregar: ")
        n2=int(input())

        #------------------------------------------
        # aux=n+n2 no es necesaria ya por lo expuesto
        # se llama de nuevo a la función crearLista
        #------------------------------------------
        crearLista(lista,n2)
        #------------------------------------------

    else:
        # se imprime un reporte y se sale de la funcion
        # con 'return' ahora sí
        for d in lista: print(d.getNombre(), d.getApellido())
        return

#----------------------------
# funcion principal
#----------------------------
def main():
    print ("Tamanio de la lista: ")
    n=int(input())
    print("\n")

    lista=[]
    crearLista(lista, n)


#----------------------------
# se llama la funcion main
#----------------------------
if __main__=="main":
    main()

cГіdigo предыдущий может примеривать в этом ссылку , sГіlo он нужен увеличивать экран для того, чтобы было возможно читать то, что просит input.

В конце концов я предлагаю, как уже они прокомментировали, проверять ее indentaciГіn, потому что это избегает того, чтобы cГіdigo он работал правильно.

0
ответ дан 02.12.2019, 05:21