index_of e get_nth di una lista in Python

oggi siamo ancora tutti più buoni; poi basta :grin:

oggi siamo ancora tutti più buoni; poi basta 😀

Recentemente ho rimediato alla mancanza (sentita almeno da me) di due funzioni indispensabili in Racket, index-of e get-nth.

Siccome ne ho postato diverse versioni riporto quelle che considero definitive, almeno per adesso 😆

(define (index-of lst ele)
  (for/or ([y lst] [i (in-naturals)] #:when (equal? ele y)) i))

(define (get-nth lst pos)
  (if (and (exact-nonnegative-integer? pos)
           (< pos (length lst)))
           (list-ref lst pos)
           "out-of-range"))

Adesso —serendipicatamente— mi sono trovato la necessità di usarle con Python, l’altro mio linguaggio di programmazione preferito (pari-merito con altri Nmila).

Chissà se si può fare?
Uhmmm…
Sì 😀

get_nth è automatica, quasi:

p0

manca la gestione del fuori range, provvedo:

def get_nth(lst, n):
	if n in range(len(lst)):
		return lst[n]
	else:
		return "out-of-range"

# test
lst = ["alpha", "beta", "gamma"]
print(get_nth(lst, 1))
print(get_nth(lst, 2))
print(get_nth(lst, 4))
print(get_nth(lst, -1))

p1

E index_of? ecco:

def index_of(lst, item):
	n = 0
	for x in lst:
		if x == item:
			return n
		n += 1
	return False

# test
lst = ["alpha", "beta", "gamma"]
print(index_of(lst, "beta"))
print(index_of(lst, "gamma"))
print(index_of(lst, "delta"))

p2

OK. Però poi un ripensamento, sapete com’è l’evilussione evoluzione che c’è anche nei linguaggi, la list comprehension, descritta in dettaglio p.es. qui e qui dove si valuta anche la sua convenienza rispetto al ciclo for.

In ogni caso ecco:

def index_of(lst, item):
	return [i for i, x in enumerate(lst) if x == item]
	
# test
lst = ["alpha", "beta", "gamma"]
print(index_of(lst, "beta"))
print(index_of(lst, "gamma"))
print(index_of(lst, "delta"))

p3

OK. Sì, ritorna una lista, in the pythonic way.

:mrgreen:

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • mirkonanto  Il 26 dicembre 2015 alle 16:53

    la tua definizione in python non mi piace molto… come distingui se data lista = [“alpha”, “beta”, “gamma”, “delta”, “out-of-range”], lista[4] è un errore o no? e nell’altro caso la funzione restituisce un intero o un booleano…

    • juhan  Il 27 dicembre 2015 alle 11:43

      Hai ragione, cioè no 🙄
      È una condizione gödeliana che si può risolvere in due modi:
      1) come si dovrebbe, settando con un metodo il messaggio;
      2) al volo come faccio io di solito.
      Considera il post come un suggerimento, un possibile punto di partenza. E di lì in poi buon lavoro 😀

Trackback

  • Ancora su index_of | Ok, panico su 30 dicembre 2015 alle 15:39

    […] Mi sa che ci sono stati un po’ di pasticci imprecisioni, incomprensioni, whatever 🙄 […]

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: