Somma tra liste

di il
7 risposte

Somma tra liste

Buonasera, ho un problema con il seguente esercizio:
Si scriva una funzione che prende in input una sequenza di liste di numeri e restituisca la sequenza in cui ogni elemento è la somma di una delle liste di numeri
Esempio L = [[1,2,3],[5,6]] restituisce [6,11]
Io lo imposto nel seguente modo, ma non mi stampa nulla
def lista_risultante_da_somma_liste_iniziali():
somma= 0
lista2 = [ ]
for n in [[1,2,3],[5,6]]:
if n in [1,2,3]:
somma1 = somma + n
else:
somma2 = somma + n
lista2 = [somma1,somma2]
print(lista2)
lista_risultante_da_somma_liste_iniziali()
COME POSSO FARE?
Grazie in anticipo per l'aiuto

7 Risposte

  • Re: Somma tra liste

    Per prima cosa, quando alleghi un sorgente, usa la funzione di formattazione "Code" disponibile nell'editor del forum.
    Per seconda cosa, il tuo codice copiato ed incollato (e re-indentato) in IDLE mi ritorna il seguente errore:
    Traceback (most recent call last):
      File "<pyshell#44>", line 1, in <module>
        lista_risultante_da_somma_liste_iniziali()
      File "<pyshell#43>", line 8, in lista_risultante_da_somma_liste_iniziali
        somma2 = somma + n
    TypeError: unsupported operand type(s) for +: 'int' and 'list'
    che spiegherebbe perché non ti stampa niente: il programma termina prima di arrivare alla 'print'...
    Perché va in errore? Perché cerchi di sommare mele con pere.
    La riga
    for n in [[1,2,3],[5,6]]:
    non ritorna un intero, ma ritorna una delle due liste! Per ottenere l'intero di una delle due liste interne, devi fare un secondo for sul risultato del primo:
    for lista_interna in lista:
            for n in lista_interna:
                somma += n
    Quando il for più interno termina, in somma hai la somma di tutti gli interi di una delle liste. Aggiungi il risultato alla lista dei risultati, azzeri somma e continui sul for esterno.
    Inoltre, così come lo hai scritto il programmetto fa un solo tipo di calcolo: la somma di una lista di due liste. E se vuoi cambiare lista cha fai? Riscrivi tutto il programma?
  • Re: Somma tra liste

    Andrea la ringrazio per la risposta. Ho provato e, dopo vari tentativi, ho scritto questo:
    def listaRisultante():
        lista2 = []
        somma = 0
        for lista_interna1 in lista:
            for n in lista_interna1:
                   somma1= somma + n
            for lista_interna2 in lista:
                for m in lista_interna2:
                   somma2 = somma + m
        lista2 = somma1, somma2
        print(lista2)
    lista = [[1,2,3],[5,6]]
    lista_interna1 = [1,2,3]
    lista_interna2 = [5,6]
    listaRisultante()
    Solo che mi stampa (6,6) invece di [6,11]
    So di essere un disastro, ma non capisco dove sbaglio. Grazie comunque per la disponibilità.
    PS Il problema sorge per più liste all'interno di una principale, li proprio non so cosa fare
  • Re: Somma tra liste

    Secondo me ti complichi molto la vita:
    
    #!/usr/bin/python3
    
    def lista_risultante(l):
        return [sum(i) for i in l]
    
    L = [[1,2,3],[5,6]] 
    
    print (lista_risultante(L))
    
  • Re: Somma tra liste

    IfNotFalseTrue ha scritto:


    Secondo me ti complichi molto la vita:
    
    #!/usr/bin/python3
    
    def lista_risultante(l):
        return [sum(i) for i in l]
    
    L = [[1,2,3],[5,6]] 
    
    print (lista_risultante(L))
    
    Ti ringrazio!
    Scusami un'ulteriore domanda: se dovessi fare lo stesso solo che con il prodotto?
  • Re: Somma tra liste

    In pratica devi solo rimpiazzare la funzione sum con una che ti restituisca il prodotto. Quindi dovrebbe essere qualcosa del tipo:
    
    def prodotto(l):
    
        for i in l:
    
    Il resto aggiungilo tu, è abbastanza banale perché con quel ciclo for in pratica scorri ogni elemento
  • Re: Somma tra liste

    IfNotFalseTrue ha scritto:


    Secondo me ti complichi molto la vita:
    
    #!/usr/bin/python3
    
    def lista_risultante(l):
        return [sum(i) for i in l]
    
    L = [[1,2,3],[5,6]] 
    
    print (lista_risultante(L))
    
    @IfNotFalseTrue NON PUOI rifilare un pezzo di codice che usa concetti evoluti di programmazione (list comprehension, operatori su liste) ad uno/una che non riesce ad implementare un BANALE ciclo.
    Per non parlare della scelta del nome delle variabili ('i' e' universalmente usato come indice, un intero, mentre qui e' una sottolista).

    Dubito fortemente che la povera @AlessiaMaz abbia capito PERCHE' quel pezzetto di codice funziona: ha fatto COPIA/INCOLLA, visto che funziona e pensa di aver risolto. Ma NON HA RISOLTO PERCHE' NON HA CAPITO, vedasi la domanda successiva.

    Quando fornisci una spiegazione, LA DEVI REGOLARE IN BASE ALLE COMPETENZE del tuo interlocutore.
    E piegare NEL DETTAGLIO DOVE ha sbagliato, in modo che CAPISCA ed impari per la prossima volta.

    Cosa che ha fatto, correttamente, @Andrea
  • Re: Somma tra liste

    Essere flammato con tanto di Caps Lock ed avatar dell'NSA, evidente simbolo di autorità, è inquietante, per cui proviamo a chiarire un po' di concetti.
    Il codice postato qui sotto è semplicemente inaccettabile per svariati motivi, il più banale è quello che Andrea ha sottolineato: che succede se le liste da sommare sono più di 2?
    L'approccio ad un problema, matematico/informatico che sia, deve essere il più generico possibile: si cerca di risolvere il problema per n casi, non certo per 2 o 3, appunto generalizzare.
    Per cui è evidente che l'approccio utilizzato non va bene.

    AlessiaMaz ha scritto:


    Andrea la ringrazio per la risposta. Ho provato e, dopo vari tentativi, ho scritto questo:
    def listaRisultante():
        lista2 = []
        somma = 0
        for lista_interna1 in lista:
            for n in lista_interna1:
                   somma1= somma + n
            for lista_interna2 in lista:
                for m in lista_interna2:
                   somma2 = somma + m
        lista2 = somma1, somma2
        print(lista2)
    lista = [[1,2,3],[5,6]]
    lista_interna1 = [1,2,3]
    lista_interna2 = [5,6]
    listaRisultante()
    Solo che mi stampa (6,6) invece di [6,11]
    So di essere un disastro, ma non capisco dove sbaglio. Grazie comunque per la disponibilità.
    PS Il problema sorge per più liste all'interno di una principale, li proprio non so cosa fare
    Inoltre l'esercizio, se ricopiato correttamente e diamo per buono che sia così, richiede che la funzione creata restituisca una sequenza, il che si traduce con un return che non è presente.
    Per cui, fatte le dovute premesse procediamo ad analizzare il problema:

    L = [[1,2,3],[5,6]]

    L'oggetto L è quello che in gergo viene chiamato "lista di liste". Essendo un iterabile è possibile accedere al singolo elemento con un ciclo for.
    È utile osservare che in Python un idioma del tipo:
    
    for i in iterable:
    	do_something()
    
    va interpretato come "per ogni elemento i dell'oggetto iterable fai qualcosa".

    Per cui tornando al nostro problema dobbiamo semplicemente eseguire la somma di ogni elemento di L, quindi di una lista.
    Nulla di più semplice:
    
    def somma(l):
        tot = 0
        for i in l:
            tot += i
        return tot
    
    Semplicemente la funziona somma prende come parametro una lista l, tot è una variabile di tipo intero inizializzata a zero ed il ciclo for semplicemente scorre lungo ogni elemento della lista l.
    Ora che abbiamo una funzione somma che funziona per una lista singola dobbiamo estendere il concetto ad una lista di liste:
    
    def lista_ris(l):
        final_list = [somma(single_list) for single_list in l]
        return final_list
    
    Quel costrutto tra parentesi quadre è chiamato "list comprehension" e semplicemente permette di creare una lista a partire da altre liste.
    Il contenuto di esso è lapalissiano: semplicemente significa "per ogni singola lista in l esegui la somma e salvala in final_list".
    A questo punto invocare la funziona lista_ris() all'interno della funzione print per stampare la lista desiderata.
    Nel caso del prodotto è sufficiente scrivere una funzione adeguata che funzione come quella scritta in questo post per la somma e che lasceremo come esercizio per l'OP.
    
    #!/usr/bin/python3
     
    
    def somma(l):
        tot = 0
        for i in l:
            tot += i
        return tot
    
    def lista_ris(l):
        final_list = [somma(single_list) for single_list in l]
        return final_list
    
    
    L = [[1,2,3],[5,6]]
    
    print(lista_ris(L))
Devi accedere o registrarti per scrivere nel forum
7 risposte