Pagina 1 di 1

[Risolt][Pytho]Appendere a lista di liste inizialmente vuota

Inviato: giovedì 15 maggio 2014, 11:05
da MagOsTranO93
Ho una lista inizialmente vuota, a cui vorrei successivamente appendere altre liste.

Queste liste sono dati ciclici, sicche creando questa lista di liste, alla fine potro' calcolarne la deviazione standard.

Siccome gli elementi di questa lista di liste sono derivati da un ciclo if, ero partito con qualcosa del genere:

Codice: Seleziona tutto

if condition_whatever == True: 
    singlelist = *qualcosa diverso ad ogni ciclo*
    totalist = totalist.append(singlelist)
Ma, se totalist e' inizialmente vuota, come in questo caso, allora viene ritornato l'errore:

Codice: Seleziona tutto

AttributeError: 'NoneType' object has no attribute 'append'
Il che e' risaputo, ma ancora non ho trovato un modo per risovere nel caso di una lista di liste. Qualche suggerimento?

Re: [Python] Appendere a lista di liste inizialmente vuota

Inviato: giovedì 15 maggio 2014, 11:42
da 1001001
Premesso che non sono esperto di python e che quindi non so se quello che sto per consigliarti sia considerato buono o cattivo python e soprattutto che, visto quanto ho appena detto, l'intervento di qualcuno più esperto di me è più che benvenuto :), io nel metodo append userei le parentesi tonde per trattare l'oggetto che stai inserendo come una tupla, in modo che sia vista come un singolo oggetto (che rimane comunque poi modificabile)

Codice: Seleziona tutto

mattia@replicant:~$ python
Python 2.7.3 (default, Feb 27 2014, 19:58:35) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> list1 = [1, 2, 3]
>>> list2 = [4, 5, 6]
>>> list3 = [7, 8, 9]
>>> list_of_lists = []
>>> list_of_lists.append ((list1))
>>> list_of_lists.append ((list2))
>>> list_of_lists.append ((list3))
>>> list_of_lists
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> list_of_lists [2][2]
9
>>> list_of_lists [2][2] = 10
>>> list_of_lists
[[1, 2, 3], [4, 5, 6], [7, 8, 10]]
>>> list_of_lists [2].append (4)
>>> list_of_lists
[[1, 2, 3], [4, 5, 6], [7, 8, 10, 4]]
>>>

Re: [Python] Appendere a lista di liste inizialmente vuota

Inviato: giovedì 15 maggio 2014, 12:32
da MagOsTranO93
Non ho provato la tua soluzione, ma il fatto di ricevere l'errore riportato (no attribute 'append') credo che prescinda da come tratto l'oggetto dell'attributo...
Infatti non so come sia possibile che a te non dia lo stesso errore (sigh).
Grazie comunque del suggerimento.

EDIT: provando in modalita' interattiva, neanche io ricevo l'errore!

Re: [Python] Appendere a lista di liste inizialmente vuota

Inviato: giovedì 15 maggio 2014, 12:37
da Claudio_F

Codice: Seleziona tutto

totalist = totalist.append(singlelist)
Il vero problema è che assegni al nome totalist il risultato della chiamata al metodo append della lista a cui inizialmente si riferisce il nome totalist, quindi la lista la perdi e totalist si riferisce ad un oggetto nullo (None). Al secondo giro del ciclo totalist si riferisce all'oggetto nullo che non ha nessun metodo append e da qui l'errore riportato.

Codice: Seleziona tutto

list_of_lists.append ((list1))
Per indicare una tupla bisognerebbe scrivere:

Codice: Seleziona tutto

list_of_lists.append ((list1,))

Codice: Seleziona tutto

>>> a=123
>>> 
>>> a == (a)
True
>>> a == (a,)
False
>>> type((a))
<type 'int'>
>>> type((a,))
<type 'tuple'>

Re: [Python] Appendere a lista di liste inizialmente vuota

Inviato: venerdì 16 maggio 2014, 3:10
da MagOsTranO93
Grazie Claudio!
Quindi invece di fare una "doppia assegnazione", mi basta usare il metodo 'append' sulla lista che voglio creare.
Riguardo all'ultima parte del commento, non ho capito molto: intendi che, anziche' usare

Codice: Seleziona tutto

    list_of_lists.append ((list1))
dovrei scrivere:

Codice: Seleziona tutto

    list_of_lists.append ((list1,))
?
Ho provato a stampare il type, e in tutti e due i casi ottengo una lista (il che mi va bene - credo -, ma non riesco a capire il tuo punto).
EDIT: in realta', e' una lista di array, e questo non so se mi va bene... :S

Re: [Python] Appendere a lista di liste inizialmente vuota

Inviato: venerdì 16 maggio 2014, 10:35
da Claudio_F
L'ultima parte riguarda solo la sintassi per fare l'append di una tupla, nel tuo caso non serve perché append inserisce già come singolo elemento l'oggetto che viene specificato (la sottolista).

Diverso sarebbe usare extend, che effettivamente spacchetta tutti gli elementi della sequenza da aggiungere accodandoli a quelli della sequenza da "ingrandire", in tal caso queste due righe ottengono lo stesso risultato (ma la seconda è inutilmente complicata):

Codice: Seleziona tutto

list_of_lists.append(new_list)

Codice: Seleziona tutto

list_of_lists.extend((new_list,))

Re: [Python] Appendere a lista di liste inizialmente vuota

Inviato: mercoledì 21 maggio 2014, 3:59
da MagOsTranO93
Ok, grazie mille! ;)