Topic: Inizializzazione lista multidimensione  (Letto 151 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline gila75

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Inizializzazione lista multidimensione
« il: Settembre 22, 2019, 18:34 »
Ciao a tutti, non so bene come fare per inizializzare una lista bidimensionale di valori diversi (non tutti 0 o altro):
Per valori uguali posso fare così:
>>> l=[[0]*3]*3
>>> l
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>>

ma io vorrei una cosa del genere:
[[0,1,2],[3,4,5],[6,7,8]]
Forse con una piccola modifica al codice sopra( l=[[0]*3]*3) è possibile farlo, ma forse mi mancano ancora cose che non conosco (probabile)
Ho provato a modificare con:
l=[[for i in range(5)]*3]*3

Ma non funziona
Ho cercato allora di far andare il cervello per puro esercizio, poi al limite proseguendo lo studio, o magari con qualche vostra dritta imparerò altri trucchi.
Sono "approdato" a questo. vorrei sapere da voi se può essere accettabile (è un po' C style a dire il vero...non sono propiamente soddisfatto):
l=[]
val=0
for i in range (5):
l1=[]
for x in range (5):
l1.append(val)
val+=1
l.append(l1)
print (l)

output:
gila@gila-pc:~/Scrivania$ python3 x.py
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]

grazie a tutti in anticipo


« Ultima modifica: Settembre 22, 2019, 18:37 da gila75 »

Offline caronte

  • python erectus
  • ***
  • Post: 225
  • Punti reputazione: 0
    • Mostra profilo
Re:Inizializzazione lista multidimensione
« Risposta #1 il: Settembre 22, 2019, 21:05 »
se vuoi manipolare tensori comincia a far andare il cervello con numpy e scordati le liste

Offline gila75

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:Inizializzazione lista multidimensione
« Risposta #2 il: Settembre 22, 2019, 21:10 »
se vuoi manipolare tensori comincia a far andare il cervello con numpy e scordati le liste

Non ti ho capito. A volte potrebbero servirmi liste bidimensionali già inizializzate. bhò...grazie lo stesso, ma non mi sei di aiuto così
Forse non ti è chiaro che sono un neofita

Offline caronte

  • python erectus
  • ***
  • Post: 225
  • Punti reputazione: 0
    • Mostra profilo
Re:Inizializzazione lista multidimensione
« Risposta #3 il: Settembre 22, 2019, 21:32 »
se,  hai intenzione di manipolare liste 'numeriche', (come da quanto postato,) tutto quello che riesci a fare con queste lo fai in maniera efficiente con  array...non ti serve a niente smanettare con le liste;
poi quale sarebbe la controindicazione per un neofita approcciare a numpy? ci vedo solo benefici

Offline gila75

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:Inizializzazione lista multidimensione
« Risposta #4 il: Settembre 22, 2019, 22:17 »
No, nessuna controindicazione, mi sembra solo prematuro al mio stato attuale. Comunque grazie, perl lo meno, adesso sapro' che ci sono approcci migliori. Mi puo' tornare utile in futuro

Offline caronte

  • python erectus
  • ***
  • Post: 225
  • Punti reputazione: 0
    • Mostra profilo
Re:Inizializzazione lista multidimensione
« Risposta #5 il: Settembre 23, 2019, 00:51 »
allora il fatto e'
1: questi problmei vanno risolti con tensori e non con liste (vedi sopra).
2: il tuo approccio con 2 nested loop e' chiaramente inefficiente --> O(n^2) ;

se proprio insisti con le lise in Python la prima cosa che puo' venir in mente e' chiaramente una compl con relativo slicing

a = list(range(10))
step = 3
[[a, a[i+1]] for i in range(0, len(a), step)]

poi esiste appunto numpy:
a=9
b=3
np.arange(a).reshape(b, b)

« Ultima modifica: Settembre 23, 2019, 00:53 da caronte »

Offline nuzzopippo

  • python habilis
  • **
  • Post: 67
  • Punti reputazione: 0
    • Mostra profilo
Re:Inizializzazione lista multidimensione
« Risposta #6 il: Settembre 23, 2019, 09:24 »
Ciao :)
 intrigato dal post ho voluto provare una list comprehensions per il "dilemma" iniziale posto da @Gila, una introduzione in merito della tecnica è nel link (sono niubbo quanto lui)
>>> l = [[y+5*x for y in range(5)] for x in range(5)]
>>> l
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]

non cambia molto dal punto di vista "efficienza" ma segnalo ;)

@Caron non ti crucciare ... penso che al momento @gila miri principalmente ad apprendere come padroneggiare gli "attrezzi" di base ed acquisire una "furma mentis" adeguata a python, ripulita dei concetti ereditati da precedenti esperienze, cosa che, per altro, occorre anche a me. Passo necessario, questo, prima di procedere ad acquisire concetti e metodi "altri", per poter valutare e scegliere quali mezzi utilizzare in una propria applicazione.

Ciò non toglie che è molto interessante il Tuo esempio con numpy
>>> import numpy as np
>>> a=25
>>> b=5
>>> np.arange(a).reshape(b,b)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24]])
>>>

Personalmente, non avevo neanche la definizione di "tensore" (vettore di vettori?) ma è interessante ciò che ho trovato, pur essendo lontano dal calcolo scientifico una volta soddisfatte le "basi" certamente numpy è tra le librerie da studiarsi. L'indicazione data è certamente utiissima :)

Offline caronte

  • python erectus
  • ***
  • Post: 225
  • Punti reputazione: 0
    • Mostra profilo
Re:Inizializzazione lista multidimensione
« Risposta #7 il: Settembre 23, 2019, 14:21 »
alloora, premettiamo che nell'esempio che ho postato della comprehensions  chiaramente manca un indice : [[a,  a[i+1]] ....ma  ci si arriva comunque..
detto questo qui non si tratta di nabbi o advanced...sta di fatto che se usi Python per i 'numeri' NON puo prescindere da Numpy..tutto il resto sono cattive abitudini che si farebbe prima ad eliminare dal proprio bagaglio;
vuoi imparare a manipolare liste? bene porta esempi non numerici in quanto cambia chiaramente la logica di implementazione...e cambiano i tools che ci puoi applicare su

Offline gila75

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:Inizializzazione lista multidimensione
« Risposta #8 il: Settembre 23, 2019, 15:31 »
@Nuzzo ha capito perfettamente la questione: io per ora voglio esercitarmi con le basi, cio' non toglie come dici tu caronte che sia una cattiva abitudine, e hai fatto bene a dirmelo. Non sapevo nemmeno esistesse quella libreria.
Lo so sono esempi sciocchi, ma piu' o meno ci siamo passati tutti.
Grazie degli esempi, sta sera dopo il lavoro li studio.
Ps: in definitiva numpy usa degli array piu' o meno come il c mi sembra di capire

Offline gila75

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:Inizializzazione lista multidimensione
« Risposta #9 il: Settembre 26, 2019, 20:12 »
>>> l = [[y+5*x for y in range(5)] for x in range(5)]
>>> l
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24]]


Questo è interessante @Nuzzo. Lasciamo perdere le prestazioni, ma è un ottimo esempio di come si possono fare le cose in python.
magari a conti fatti è uguale alla mia versione con append(), ma almeno mi esercito con sintassi nuove.
Conservo e tengo ben a mente come dice @Caronte, che non è la via maestra se si vogliono manipolare array numerici.
Dire che su questo argomento non ho altro da aggiungere io...grazie ragazzi ;)