Gestione di una coda in Python – 1

art-ma-2

Un post facile, didascalico, introduttivo alla valutazione per uno script che si comporta proprio come la fila allo sportello. Altamente sperimentale, nèh!

Si può fare con una lista. Ecco come crearla e inserire elementi:

>>> ls = []
>>> len(ls)
0
>>> ls.append(1)
>>> ls.append(2)
>>> ls.append('tre')
>>> ls
[1, 2, 'tre']
>>> len(ls)
3

Richiamare elementi:

>>> ls[2]
'tre'

Verificare se un elemento è presente:

>>> 2 in ls
True
>>> 8 in ls
False

Estrarre elementi:

>>> ls = [1, 2, 3, 4, 5, 6]
>>> ls.pop()
6
>>> ls
[1, 2, 3, 4, 5]

non come serve, funziona come una pila (stack). È però immediato rimediare, così:

>>> ls.pop(0)
1
>>> ls
[2, 3, 4, 5]
>>> ls.pop(0)
2
>>> ls
[3, 4, 5]

In previsione di un uso in qualche misura intensivo conviene costruire funzioni per semplificarne la gestione. Le funzioni che si costruiscono sono semplici e per quanto possibile conviene usare la sintassi lambda. Inoltre i nomi inizieranno tutti con q (come  coda  queue).

L’assegnazione è semplice, resta LS = [].

Inserimento

>>> qapp = lambda ls, dat : ls.append(dat)

la provo:

>>> LS = []
>>> qapp(LS, 'a')
>>> qapp(LS, 'b')
>>> qapp(LS, 'c')
>>> LS
['a', 'b', 'c']

Estrazione del primo dato, quello in testa il car del Lisp:

>>> qext = lambda ls : ls.pop(0)  # versione iniziale, migliorabile
>>> d = qext(LS)
>>> d
'a'
>>> e = qext(LS)
>>> e
'b'
>>> f = qext(LS)
>>> f
'c'
>>> g = qext(LS)
Traceback (most recent call last):
  File "", line 1, in 
  File "", line 1, in 
IndexError: pop from empty list

OOPS! funziona se la lista non è vuota; da correggere testanto la lista con un if che in lambda ha una sintassi sua:

>>> qext = lambda ls : ls.pop(0) if len(ls) > 0 else None
>>> LS = ['1', 'b', 'ultimo']
>>> qex(LS)
'1'
>>> qext(LS)
'b'
>>> d = qext(LS)
>>> d
'ultimo'
>>> e = qext(LS)
>>> print(e)
None

OK; per estrarre un dato che non è il primo

>>> qexnth = lambda ls, n : ls.pop(n) if len(ls) >= n else None
>>> LS = [1, 2, 3, 4]
>>> qexnth(LS, 2)
3
>>> LS
[1, 2, 4]
>>> d = qexnth(LS, 5)
>>> LS
[1, 2, 4]
>>> print(d)
None

Ma è più utile estrarre un dato in base an suo valore, non per l’indice

>>> qexd = lambda ls, dat : ls.pop(dat in ls) if dat in ls else None
>>> LS = [1, 10, 100]
>>> qexd(LS, 10)
10
>>> LS
[1, 100]
>>> qexd(LS, 1000)
>>> LS
[1, 100]

OK 😁 Continua, forse 😁

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: