RISOLTO Sorting

Filippo Fabbri

Nuovo Utente
47
8
Ragazzi ho un problema enorme, devo implementare due funzioni.
La prima deve, dato un numero intero in base 10 , restituire una lista i cui elementi sono le cifre del numero rappresentate come interi
Esempio f(2043) -> [2,0,4,2]

La seconda inserire un oggetto persona in ordine alfabetico prima per cognome poi per nome.

ho fatto errori ma non so dove, la prima funzione restituisce una lista vuota, la seconda da errore.

Codice:
#esercizio C

def lista_cifre(numero):
    lista_interi=[]
    numero=str(numero)
    for i in numero:
        lista_interi.append(int(i))
    return lista_interi
  
#esercizio D e E

class persona:
    def __init__(self,nome,cognome):
        self.nome=str(nome)
        self.cognome=str(cognome)
    def __str__(self):
        return 'Persona:'+self.nome +self.cognome
      
def inserisci(persona,lista_persone):
    lista_persone.append(persona)
    l=[]
    for i in range(len(lista_persone)):
        while not lista_persone[i].cognome <= persona.cognome:
            if lista_persone[i].cognome == persona.cognome:
                if lista_persone[i].cognome < persona.cognome:
                    return lista_persone.insert(i+1,persona)
            elif lista_persone[i].cognome > persona.cognome:
                return lista_persone.insert(i,persona)
            else:
                return lista_persone.insert(i,persona)
            i += 1
    l.append(persona)
  
def main():
    print('Esercizio C\n')
    lista_interi=[]
    j=input('Vuoi inserire un intero nella lista?\nDigita si oppure no: ')
  
    if j=='si':                                                                 #allora inserisco l'intero nella lista                                                             
        n=input('Scrivi il numero intero desiderato: ')                         #chiedo il numero
                                               
        lista_cifre(n)                                                         
                                                                  
        print('La lista contiene questi interi:\n')
        print(lista_interi)
      
    else:                                                                       #non inserisco nessuno
        print('La lista è vuota')
  
    time.sleep(3)                                                               #faccio scorrere qualche secondo per rendere a mio avviso più soddisfacente l'esecuzione
  
    print('Esercizio E\n')
    lista_persone=[]
    h=input('Vuoi inserire delle persone nella lista?\nDigita si oppure no: ')
    q=int(input('Quante?: '))
  
    if h=='si':                                                                 #allora inserisco persone nella lista
        i=1                                                                     #inizializzo un conteggio
        while q>0:                                                              #ciclo dell' aggiunta di q persone
            n=input('Scrivi il nome della persona numero '+str(i)+': ')         #chiedo il nome della persona i
            c=input('Scrivi il cognome della persona numero ' +str(i)+': ')     #chiedo cognome della persona i
            p=persona(n,c)                                                      #trasformo la persona come oggetto
            inserisci(p,lista_persone)                                          #inserisco l'oggetto in una lista
            i = i+1                                                             #aggiorno il conto della persona da inserire
            q = q-1                                                             #diminuisco il conto delle persone rimaste da inserire
        print('La lista contiene queste persone:\n')
        print(lista_persone)
    else:                                                                       #non inserisco nessuno
        print('La lista di persone è vuota')

  
main()

Qualcuno mi può aiutare?
 
Ultima modifica:

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
nell'esercizio sulla lista non c'è bisogno di convertire in int il numero passato (il parametro non ha tipo, viene preso per stringa, come tutto in Python)
Python:
def lista_cifre(numero):
    lista=[]
    for i in numero:
        print(i)
        lista.append(i)
    return lista
Nella funzione main non hai assegnato il valore di ritorno di lista_cifre
Python:
def main():
    n=input('Scrivi il numero intero desiderato: ')
    lista_interi=lista_cifre(n)
    print('La lista contiene questi interi:\n')
    print(lista_interi)
Semmai ci sarebbe da discutere sull'input:
in Python quando tu inserisci un input, esso viene sempre interpretato come stringa;
se il numero deve essere intero dovresti prima definire una funzione che controlla che l'input inserito sia veramente un int. Il codice precedente, più che suddividere in cifre, divide la stringa in caratteri, infatti funziona su stringhe generiche anche non composte da numeri (e questo non va bene)
 

Filippo Fabbri

Nuovo Utente
47
8
ho risolto il problema ma mi rimane un dilemma, in questo code faccio un sorting per cognome di un oggetto persona(nome, cognome) da inserire in una lista, come faccio a fare in modo che se ci sono cognomi identici me li sorti in base al nome per primo in ordine alfabetico?

Codice:
def inserisci(persona,lista_persone):
    lista_persone.append(persona)
    l=[]
    for i in range(len(lista_persone)):
        while not lista_persone[i].cognome <= persona.cognome:
            if lista_persone[i].cognome == persona.cognome:
                if lista_persone[i].cognome < persona.cognome:
                    return lista_persone.insert(i+1,persona)
            elif lista_persone[i].cognome > persona.cognome:
                return lista_persone.insert(i,persona)
            else:
                return lista_persone.insert(i,persona)
            i += 1
    l.append(persona)
 

Matu

Moderatore
Staff Forum
Utente Èlite
2,837
3,757
CPU
Intel Core i5 13600K
Dissipatore
Corsair H100x
Scheda Madre
MSI Z690 Tomahawk Wifi
HDD
SSD: 2x Samsung 970 Evo Plus 1 TB, OCZ ARC100 240 GB HDD: WD Caviar Blue 1TB
RAM
Kingston Fury Renegade 32 GB (2x16 GB) 3600Mhz
GPU
Pny RTX 4080 Verto
Monitor
LG 27GL850 UltraGear 144Hz 2560x1440
PSU
Corsair CX750M ATX
Case
Sharkoon M30 RGB
Periferiche
Tastiera: Cooler Master Masterkeys LITE L - Mouse: HyperX Pulsefire Core - Casse: Edifier R1280T - Cuffie: SPC Gear VIRO - Microfono: Speedlink PURE
Net
FTTC
OS
Windows 11 Pro
@Filippo Fabbri se hai risolto basta scrivere un commento ma non esiste che elimini tutti i commenti, altrimenti non può essere di aiuto per chi dovesse averne bisogno in futuro.
 
  • Mi piace
Reazioni: Mursey

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
come faccio a fare in modo che se ci sono cognomi identici me li sorti in base al nome per primo in ordine alfabetico?
"me li sorti" non è lingua italiana, non farlo ad un esame perché ti bocciano, si dice "ordinare"!

Tornando a noi potresti, molto banalmente, concatenare cognome-nome e conforntarli come se fossero un'unica stringa;
in alternativa ti scrivi una funzione di confronto a parte che tiene conto del fatto che 2 cognomi possano essere uguali;
se non erro si possono definire criteri di confronto più complicati per gli oggetti
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili