[Risolto][Python] Liste

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python] Liste

Messaggio da nuzzopippo »

gila75 [url=https://forum.ubuntu-it.org/viewtopic.php?p=5023379#p5023379][img]https://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Sempre riguardo le liste, credo di incontrarlo nel libro, ma se me lo anticipate... :D
---
Come diavolo fa uno se deve cambiare le lettere?
Sei obbligato con funzioni di libreria?
Capisco che viene interpretata come stringa nella lista...ma bho, non so
Le stringhe sono immutabili, le liste no, ne consegue :

Codice: Seleziona tutto

>>> my_list=["gila","python","123"]
>>> print(my_list[0][1])
i
>>> my_list[0] = 'gxla'
>>> print(my_list[0][1])
x
>>> print(my_list)
['gxla', 'python', '123'] 
Perché? ... Perché son costruite così :) prenderne atto e tenerlo presente è l'unica imho
[Edit] my è venuto in mente subito dopo aver chiuso :

Codice: Seleziona tutto

>>> altralista = list(my_list[0])
>>> print(altralista)
['g', 'x', 'l', 'a']
>>> my_list[0] = altralista
>>> my_list[0][1] = 'i'
>>> print(my_list[0][1])
i
>>> 
>>> print(my_list)
[['g', 'i', 'l', 'a'], 'python', '123']
Fatti non foste a viver come bruti ...
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [Python] Liste

Messaggio da Claudio_F »

gila75 ha scritto:Come :devilmad: fa uno se deve cambiare le lettere?
Come detto my_list[0] si riferisce ad una stringa che non è mutabile.
Se si vuole accedere / modificare i caratteri come una simil matrice:

Codice: Seleziona tutto

>>> my_list = [list("gila"), list("python"), list("123")]
>>> my_list[0][1] = "x"
>>> print(my_list[0])
['g', 'x', 'l', 'a']
>>> print("".join(my_list[0]))
gxla
Avatar utente
toro2k
Prode Principiante
Messaggi: 148
Iscrizione: lunedì 30 gennaio 2012, 12:56
Località: Savona

Re: [Python] Liste

Messaggio da toro2k »

gila75 ha scritto: Come diavolo fa uno se deve cambiare le lettere?
Molto semplicemente non lo fa. Si usano altri metodi, tipo quello proposto da Claudio_F.
gila75 ha scritto: Sei obbligato con funzioni di libreria?
Non hai tanta scelta, in Python sono molto poche le cose che non siano funzioni di libreria, rassegnati! :)

Venendo alla tua domanda non credo ci siano modi più "Pythonici" per esprimere l'algoritmo, la soluzione di Claudio_F mi pare sia la più sensata, ma farei un paio di modifiche:

Codice: Seleziona tutto

def giuseppe_flavio(slaves, start, step):
    # Se non ci sono schiavi, non possono esserci sopravvissuti!
    if len(slaves) == 0:
        return None

    # Io eviterei, come la peste, di spostare l'indice indietro di uno,
    # in Python gli indici delle liste partono da 0, quindi e' molto meglio
    # contare gli schiavi a partire da 0. Si riduce il rischio di errori!
    toKill = start

    while len(slaves) > 1:
        # Algoritmo come postato inizialmente.
        toKill = (toKill + step - 1) % len(slaves)
        # Pop e' meglio di del, restituisce il valore che hai cancellato
        killed = slaves.pop(toKill)
        print('Killed: {}'.format(killed))

    return slaves[0]

slaves = list(range(1,10))
survivor = giuseppe_flavio(slaves, start=0, step=5)
print(survivor)
P.S. guarda sempre con sospetto quelli che usano il termine "Pythonico" :D
Software is meant to be soft!
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [Python] Liste

Messaggio da Claudio_F »

Riguardo al discorso dell'indice ho cercato di ragionare in astratto, nel senso che noi non dovremmo sapere l'implementazione interna della funzione (se usa indici, liste, varie ed eventuali), ma usarla per operare nel dominio del problema, che consiste di N disgraziati numerati da 1 a N (ma al posto dei numeri potrebbero esserci i nomi delle persone o di animali ecc), e da uno di quei numeri/nomi dobbiamo partire.

In effetti i fortunati potrebbero anche essere mescolati senza alcun riferimento agli indici usati nella funzione:

Codice: Seleziona tutto

#Py3
import random
SLAVES = 9
STEP = 5
START = random.randrange(SLAVES) + 1
#-------------------------------------------------------------      
def g_flavio(lista, passo, start):
   i = lista.index(start);
   while len(lista) > 1:
      killed = lista.pop(i)
      print("kill: {}  {}".format(killed, lista))
      i = (i + passo - 1) % len(lista)
   return lista[0]

#-------------------------------------------------------------      
lista = list(range(1, SLAVES+1))
random.shuffle(lista)
print("lista originale: {}\n{}".format(lista, "-"*25))
survivor = g_flavio(lista[:], passo=STEP, start=START)
print("sopravvissuto: {}".format(survivor))
Alcune esecuzioni:

Codice: Seleziona tutto

[2, 3, 6, 7, 1, 4, 9, 5, 8]
-------------------------
kill: 8  [2, 3, 6, 7, 1, 4, 9, 5]
kill: 1  [2, 3, 6, 7, 4, 9, 5]
kill: 3  [2, 6, 7, 4, 9, 5]
kill: 5  [2, 6, 7, 4, 9]
kill: 9  [2, 6, 7, 4]
kill: 2  [6, 7, 4]
kill: 7  [6, 4]
kill: 4  [6]
sopravvissuto: 6

Codice: Seleziona tutto

[9, 7, 2, 1, 5, 6, 8, 3, 4]
-------------------------
kill: 5  [9, 7, 2, 1, 6, 8, 3, 4]
kill: 9  [7, 2, 1, 6, 8, 3, 4]
kill: 8  [7, 2, 1, 6, 3, 4]
kill: 1  [7, 2, 6, 3, 4]
kill: 2  [7, 6, 3, 4]
kill: 6  [7, 3, 4]
kill: 4  [7, 3]
kill: 7  [3]
sopravvissuto: 3

Codice: Seleziona tutto

[3, 4, 1, 5, 8, 9, 7, 2, 6]
-------------------------
kill: 1  [3, 4, 5, 8, 9, 7, 2, 6]
kill: 2  [3, 4, 5, 8, 9, 7, 6]
kill: 8  [3, 4, 5, 9, 7, 6]
kill: 4  [3, 5, 9, 7, 6]
kill: 3  [5, 9, 7, 6]
kill: 5  [9, 7, 6]
kill: 7  [9, 6]
kill: 6  [9]
sopravvissuto: 9

Riguardo al controllo di cosa si passa alla funzione... in genere in un esempio/esercizio si assume che i dati in ingresso siano "well-formed", altrimenti, se si prevede che nell'utilizzo reale possano essere incongruenti, ci si dovrebbe chiedere in quale modo sensato per il dominio del problema vada fatta la gestione degli errori.

Per me non ha senso nell'uso reale passare una lista vuota ottenendo nessun sopravvissuto, come non ha senso che il boia entri in una stanza vuota ed esca dicendo che non è sopravvissuto nessuno... nel caso reale il boia entrerebbe e griderebbe "ma qui non c'è nessuno!", quindi secondo me la funzione dovrebbe incazzarsi di brutto:

Codice: Seleziona tutto

def g_flavio(lista, passo, start):
   if not lista  or  start not in lista:
       raise ValueError("Lista vuota o elemento di partenza mancante")
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] Liste

Messaggio da gila75 »

grazie ragazzi.
Ho visto come hai fatto @Claudio.
La trovo un po' macchinosa la storia delle stringhe in python.
Ma se hanno deciso così, me ne farò una ragione. Non la capisco ma l'accetto.
Mannaggia... non si poteva fare tipo il C const e non cambi e per il resto si??? :D
Ma non divago, è così e basta. Ci saranno dei motivi su questa filosofia che per ora non posso afferrare.
Riguardo al discorso dell'indice ho cercato di ragionare in astratto, nel senso che noi non dovremmo sapere l'implementazione interna della funzione (se usa indici, liste, varie ed eventuali), ma usarla per operare nel dominio del problema, che consiste di N disgraziati numerati da 1 a N
Infatti: nella relatà si parte da 1 a N persone, tutto li.
Piuttosto @Claudio: non capisco perchè

Codice: Seleziona tutto

return lista[0]
Non credo sia necessario ritornare alcunchè. No?
Stampo la lista alla fine che sarà necessariamente list[0].
é più elegante come hai fatto tu, ma non ho capito bene la necessità.
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [Python] Liste

Messaggio da Claudio_F »

Gli oggetti immutabili sono hashabili.
Stringhe mutabili non potrebbero essere usate come chiavi di dizionario.
Non c'è alcun obbligo di ritornare lista[0], ma mi sembra più corretto che una funzione restituisca il valore richiesto (il boia dice "è sopravvissuto il 4", non "leggetevi la lista di chi è rimasto").
Altre cose non indispensabili sono nella chiamata della funzione (aiutano a non fare confusione tra i parametri e a non modificare i dati di lavoro con possibili effetti collaterali).
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] Liste

Messaggio da gila75 »

Capisco...o meglio per ora prendo per buono.
Si il discorso del boia hai ragione, dal punto di vista "umano" ha piu' senso.
Grazie, proseguo...tempo permettendo
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [Python] Liste

Messaggio da Claudio_F »

gila75 ha scritto:dal punto di vista "umano" ha piu' senso
"Altissimo livello" non significa solo avere oggetti già equipaggiati di funzioni per ogni necessità (per questo basterebbe un'estesa libreria), direi che significa piuttosto potersi permettere (ovviamente entro certi limiti) di non pensare alla macchina, al sistema operativo, ai tipi dati ecc, e ragionare invece su oggetti che si parlano scambiandosi informazioni e/o comandi senza che nessuno sappia "cosa c'è dentro" agli altri o come funzionano.

Naturalmente le parti più "low level" del programma dovranno per forza fare i conti con l'implementazione, e quindi indici, contatori ecc, per cui si finisce per scrivere cose come:

Codice: Seleziona tutto

nome = campi[TECN].split('-')[1].strip()[:20].ljust(20,' ')
(tratto da un mio programma reale)
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] Liste

Messaggio da gila75 »

Si, credo che la programmazione a oggetti sia propio cosi': questo oggetto fa questo o quello
Non preoccuprti di cosa gira sotto.
Bello? Bho...secondo me tu claudio apprezzi molto perche' sai come davvero gira sotto. Insomma se non sai nulla, che brutto dire:
Le cose sono cosi' punto e basta.
Va bhe, appena posso, ma vado a rilento, proseguo
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] Liste

Messaggio da gila75 »

@Claudio:
ma qui

Codice: Seleziona tutto

my_list = [list("gila"), list("python"), list("123")]
in poche parole si fa una lista di liste se l'output è questo:

Codice: Seleziona tutto

>>> print my_list
[['g', 'i', 'l', 'a'], ['p', 'y', 't', 'h', 'o', 'n'], ['1', '2', '3']]
Giusto?
Scusami ma faccio fatica a studiare...maledetto tempo :muro:
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1627
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Python] Liste

Messaggio da nuzzopippo »

Non sono @Claudio ma è giusto : si crea una lista di liste.

Il tempo, non è mai sufficiente a studiare un linguaggio di programmazione, mal comune :) domanda OT : come trovi il testo che hai acquistato?
Fatti non foste a viver come bruti ...
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] Liste

Messaggio da gila75 »

Per ora bene, ma devo entrare nel vivo. Diciamo unica pecca che accenna molto ad argomenti per poi rimandare, ma e' troppo presto. Mi sembra comunque buono. Piu' avanti ti faro' sapere meglio.
Grazie per la risposta
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [Python] Liste

Messaggio da Claudio_F »

È una lista di liste di stringhe lunghe 1 (avevo usato questo sistema per simulare una memoria video 80 colonne per 25 righe, in modo da accedere ai singoli caratteri con vidmem[riga][colonna]).

Se la sintassi è scomoda si può anche fare in due passaggi:

Codice: Seleziona tutto

my_list = ["gila", "python", "123"]
my_list = [list(el) for el in my_list]
In Py2 basterebbe anche solo:

Codice: Seleziona tutto

my_list = map(list, my_list)
Che però in Py3 diventa:

Codice: Seleziona tutto

my_list = list(map(list, my_list))
e quindi meno immediato da leggere, per cui è preferibile il primo esempio.
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] Liste

Messaggio da gila75 »

Grazie. Faccio fatica a gestire questi modi. Forse abitutini del c, non so.
Notavo ieri poi: le stringe sono immutabili, pero' il concatenamento lo puoi fare.
In un certo senso viene mutata...all'inizio e' sempre difficile se poi si studia a pizzichi e bocconi...

EDIT:

ricapitolando sulla modifica delle singole lettere.
Ho guardato bene l'esempio di Claudio.
per prova ho scritto:

Codice: Seleziona tutto

l=["casa"]
l = map(list, l)
print l
l[0][0]="x"
print l
print type(l[0][0])
print type(l)
print("".join(l[0]))

e ottengo:

Codice: Seleziona tutto

[['c', 'a', 's', 'a']]
[['x', 'a', 's', 'a']]
<type 'str'>
<type 'list'>
xasa
in poche parole casa, viene spezzata in una lista di liste. O se vogliamo in un array bidimensionale.
L'oggetto restituito da:
print type(l[0][0])
è ancora str, ma essendo in una lista è mutabile, quindi poi ricompongo con join.
Corretto?
* spezzo con map (che però non ho ancora studiato, verrà dopo)
* modifico
* ricompongo.
Giusto?
OT: stavo guardando i dizionari e le strutture annidate che ci puoi fare: liste, liste di liste ecc.
Roba che in c a creare oggetti di simile complessità ti spacchi il cu.... :D la testa :)
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [Python] Liste

Messaggio da Claudio_F »

gila75 ha scritto:le stringe sono immutabili, pero' il concatenamento lo puoi fare
Viene creata una nuova stringa, quelle vecchie se non hanno più riferimenti vengono buttate.
è ancora str, ma essendo in una lista è mutabile, quindi poi ricompongo con join.
La stringa resta immutabile. È il riferimento a cui punta la lista che può cambiare.
* spezzo con map (che però non ho ancora studiato, verrà dopo)
* modifico
* ricompongo.
Giusto?
Si è un tipico procedere pythonico (applicare trasformazioni a intere sequenze di elementi).
stavo guardando i dizionari e le strutture annidate che ci puoi fare: liste, liste di liste ecc.
Il dizionario è il modo più elastico per strutturare le informazioni. Tra l'altro il formato di interscambio dati sotto forma di stringa ASCII Json è praticamente pari pari a un dizionario Python (il modulo Json permette appunto il passaggio dict->stringa Json e viceversa).
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Python] Liste

Messaggio da gila75 »

Si è un tipico procedere pythonico (applicare trasformazioni a intere sequenze di elementi).
Caspita però, non riduce le prestazioni in modo drastico?
Nel senso: per cambiare una singola lettera, guarda quante operazioni.
Ok che il punto di forza del python non è la velocità...però...
probabilmente (anzi di sicuro) questa filosofia sacrifica un po' i tempi a favore di una manipolazione comodissima di molti oggetti.
Che come detto per esempio in C (ma credo anche Java e C++) ti porterebbero al manicomio.
Sui dizionari ho delle domande, ma aprirò.
Credo che questo 3d sia risolto, aspetto un po' poi applico il "risolto"
per il momento grazie a tutti.
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [Python] Liste

Messaggio da Claudio_F »

gila75 ha scritto:Caspita però, non riduce le prestazioni in modo drastico?
Le solite 25..30 volte :sisi:
Che come detto per esempio in C (ma credo anche Java e C++) ti porterebbero al manicomio.
Java, C# e Javascript si situano "grosso modo" al livello di astrazione di Python, C++ è un gradino più a basso livello (c'è ancora la gestione esplicita di memoria e puntatori), ma avendo gli oggetti in parte si compensa la difficoltà (che resta comunque alta se si vogliono realizzare elaborazioni non banali).
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 13 ospiti