sommare un elemento ad una tupla di più valori, IN'UNICA ISTRUZIONE

A
AmritV (830 points)
6 8 11
asked Dec 19, 2019 in Programmare in Python by AmritV (830 points)
recategorized Jan 6, 2020 by andrea.sterbini
Salve,

come da titolo, volevo sapere se è possibile sommare un elemento ad una tupla/lista di piu elementi ricorrendo ad un'unica istruzione e senza ricorrere a nessun ciclo o a funzioni esterne.

ES: lista=[2,2,2]   /elemento da sommare 1:

risultato=[3,3,3]
613 views

3 Answers

Best answer
AlessandraIzzo (6010 points)
6 6 30
answered Dec 19, 2019 by AlessandraIzzo (6,010 points)
selected Dec 19, 2019 by AmritV
Se una comprehension list ti va bene:

lista = [x + daSommare for x in lista]

Se cerchi qualcosa che non iteri in qualche modo su tutti gli elementi, non vedo come possa funzionare. Non credo esista.
A
AmritV (830 points)
6 8 11
commented Dec 19, 2019 by AmritV (830 points)

Ti spiego, avrei una funzione ricorsiva che mi ritorna due elementi, quindi una tupla. 

Ed io vorrei aggiungere ad entrambe le parti un valore equo...

A
AmritV (830 points)
6 8 11
commented Dec 19, 2019 by AmritV (830 points)
Ovviamente quando la richiamo la funzione ricorsiva, qualcosa del genere:

1+chiamata funzione ricorsiva()
AlessandraIzzo (6010 points)
6 6 30
commented Dec 19, 2019 by AlessandraIzzo (6,010 points)
Quindi vuoi evitare di scrivere:

nuovaTupla = (risultato[0]+1, risultato[1]+1)? (ricordo che non puoi modificare una tupla)

Cioè, siccome sai che la tupla ha sempre 2 elementi puoi fare semplicemente così ma chiedi se c'è un modo ancora più breve, mi pare di capire. Non credo, mi spiace.
E
Edward (25950 points)
2 4 172
commented Dec 19, 2019 by Edward (25,950 points)
Se gli elementi sono solo due puoi fare così

risultato = (1,) + risultato + (1,)

poi quando avrai finito...
parte1 =  sum(:risultato[len(risultato)//2])
parte2 = sum(risultato[len(risultato)//2:])

però non è molto efficiente, e sum comunque itera tra gli elementi ¯\_(ツ)_/¯
A
AmritV (830 points)
6 8 11
commented Dec 19, 2019 by AmritV (830 points)

Si esatto voglio evitare di scrivere: risultato[0]+1, risultato[1]: siccome se "risultato" è una funzione, mi andrebbe a generare due ricorsioni e non una!!!

Scusa se sono poco chiaro, ma non saprei come spiegarmi meglio.

grazie, nel frattempo ho avuto una piccola illuminazione!! : penso che basti inserire i due parametri come argomenti della funzione , cosi facendo posso gestirmeli più facilmente.

AlessandraIzzo (6010 points)
6 6 30
commented Dec 19, 2019 by AlessandraIzzo (6,010 points)
Beh io per "risultato" intendevo il valore tornato dalla funzione, non la funzione
Comunque sì, non ti fare scrupoli col passaggio di parametri, che qua tutti passiamo un sacco di parametri per cercare di rendere il codice più efficiente ^^ (ad esempio lunghezze varie, per non calcolarle ogni volta)
E
Edward (25950 points)
2 4 172
answered Dec 19, 2019 by Edward (25,950 points)
con numpy puoi fare così:

import numpy
lista = [1,2,3]
risultato = numpy.array(lista) + 1

Ed avrai un oggetto di tipo numpy.ndarray
Non so però com'è implementato, probabilmente fa comunque un for perchè gli elementi deve scorrerli in qualche modo :D
Lorenzo Cristini (10830 points)
0 0 27
answered Dec 19, 2019 by Lorenzo Cristini (10,830 points)
Non so se è quello che intendi, però puoi usare la map che prende come argomenti una funzione e un iterabile. Come funzione ci metti una lambda che somma 1 e come iterabile la tupla, ovviamente credo che lo faccia comunque con un ciclo, ma almeno lo fai in una riga