Topic: __getitem__ per l'indice  (Letto 98 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline tommyb1992

  • python neanderthalensis
  • ****
  • Post: 289
  • Punti reputazione: 0
    • Mostra profilo
__getitem__ per l'indice
« il: Settembre 18, 2018, 14:02 »
import random

class Chromosome(object):
    dna = "ATCG"

    def __getitem__(self, index):
        return self.dna[index]

    def __len__(self):
        return len(self.dna)

c = Chromosome()

print(random.choice(c))


examples:

>python test2.py
C

>python test2.py
A

>python test2.py
C

>python test2.py
A

>python test2.py
G


Mi servirebbe un metodo che mi restituisce l'indice invece del valore, e non posso sostituire __getitem__ facendo "return index" perchè ho bisogno anche del metodo che mi restituisce il valore.

Esiste qualcosa di nativo senza che mi invento nulla tipo: random.randint(0, len(c) - 1)?
« Ultima modifica: Settembre 18, 2018, 14:04 da tommyb1992 »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.821
  • Punti reputazione: 9
    • Mostra profilo
Re:__getitem__ per l'indice
« Risposta #1 il: Settembre 18, 2018, 16:14 »
>  un metodo che mi restituisce l'indice
eh, ma l'indice a partire da COSA? Per esempio, le stringhe (e le liste, etc) hanno un metodo "index" che restituisce l'indice della prima occorrenza del termine cercato. Niente ti vieta di implementare un metodo "index" anche per la tua classe, se vuoi continuare sulla strada di replicare la normale api di una sequenza python.

Detto questo... mah. Non è che capisco quello che stai cercando di fare... saprai tu.

Offline tommyb1992

  • python neanderthalensis
  • ****
  • Post: 289
  • Punti reputazione: 0
    • Mostra profilo
Re:__getitem__ per l'indice
« Risposta #2 il: Settembre 18, 2018, 18:50 »
>  un metodo che mi restituisce l'indice
eh, ma l'indice a partire da COSA? Per esempio, le stringhe (e le liste, etc) hanno un metodo "index" che restituisce l'indice della prima occorrenza del termine cercato. Niente ti vieta di implementare un metodo "index" anche per la tua classe, se vuoi continuare sulla strada di replicare la normale api di una sequenza python.


In base a questo: random.choice(c)), invece della C, per esempio, voglio il 2

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.821
  • Punti reputazione: 9
    • Mostra profilo
Re:__getitem__ per l'indice
« Risposta #3 il: Settembre 19, 2018, 09:10 »
Uh? Non credo di aver capito, perché se ho capito allora non ha nessun senso. Voglio dire, se ti serve un numero casuale compreso tra 0 e len(c), allora pesca un numero casuale tra 0 e len(c).
Ma probabilmente ho capito male.
(In tutto questo, ripeto, non sono proprio convintissimo dell'implementazione di quella classe, in generale. Ma forse è troppo presto per dire qualcosa).

Offline tommyb1992

  • python neanderthalensis
  • ****
  • Post: 289
  • Punti reputazione: 0
    • Mostra profilo
Re:__getitem__ per l'indice
« Risposta #4 il: Settembre 19, 2018, 09:42 »
E' una classe semplificata,
comunque si l'opzione A era appunto: random.randint(0, len(c) - 1)

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 2.821
  • Punti reputazione: 9
    • Mostra profilo
Re:__getitem__ per l'indice
« Risposta #5 il: Settembre 19, 2018, 12:50 »
A parte che sarebbe random.randrange(len(c)) semmai... impariamo a usare gli strumenti giusti.
Comunque sì, avevo capito purtroppo, e in effetti ha pochissimo senso. Boh, che posso dire, se davvero credi che la tua classe "cromosoma" abbia bisogno di un metodo che restituisce una *posizione* casuale della stringa delle basi, allora implementalo. Questo però non ha niente a che vedere con __getitem__, che, in una sequenza, ti restituisce l'elemento corrispondente alla posizione specificata. Non esiste un "equivalente" di __getitem__ per restituire la posizione *casuale*, perché __getitem__ non restituisce un elemento *casuale*. I termini del problema non sono quelli che avevi specificato.

> E' una classe semplificata,
Mah, si può fare una cosa semplificata *e* giusta. A naso, il tuo sembra un approccio... non-proprio-giustissimo, semplificato o meno che sia. Tanto per cominciare, non capisco perché la stringa delle basi deve essere un attributo di classe invece di un più normale attributo di istanza. Cioè, magari ci hai pensato sopra, ma non capisco che vantaggio ti può dare. Poi non so, finora stai replicando pari pari l'api di una stringa... ma allora perché non usare una stringa.
Poi c'è un problema pratico, ovviamente: non so che cosa stai cercando di fare, ma nella vita reale i cromosomi sono sequenze di *decine di milioni* di basi. Non so se usare una comune stringa python per rappresentare la sequenza sia proprio un'idea vincente.
(Poi certo, ci sono standard scientifici per la rappresentazione dei dati genetici, e pacchetti python per la loro manipolazione... ma onestamente la bioinformatica non è proprio il mio campo e non saprei bene cosa dire).