[Risolto] Python: vorrei abbinare un numero ad una lettera

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

[Risolto] Python: vorrei abbinare un numero ad una lettera

Messaggio da raffaele63 »

Ciao a tutti,
ho necessità di abbinare una parte numerica ad una parte alfabetica. Provo a spiegare meglio, ho una serie di dati che sono:
Funzione A
1) Numero dei concorrenti;
2) Nominativo concorrenti;
3) Un file dove vengono inseriti i nominativi;
Funzione B
1) Numero partecipanti;
2) Generatore di lista numerica casuale ( basata sul numero partecipanti). ( es. Se i partecipanti sono 5 la lista sarà 5-3-1-4-2);
3) Il file dei nominativi in lettura;
Quello che vorrei ottenere è abbinare il primo numero generato al primo nominativo, il secondo al secondo e cosi via fino al termine dei nominativi.
Al momento quello che ottengo è questo (dove cognome è stato volutamente messo al posto dei veri cognomi):

Inserire numero settori/concorrenti: 5
cognome;
5-4-3-1-2
cognome;
5-4-3-1-2
cognome;
5-4-3-1-2
cognome;
5-4-3-1-2
cognome;
5-4-3-1-2

Ora posto il codice con il quale ottengo detto risultato.
Funzione A:

Codice: Seleziona tutto

conc=input("Immettere il numero dei concorrenti: ")
soci=raw_input("Tesserato: ")+(";\n")
f=open("Iscritti.dat","w")
f.write(soci)
f.close()
if soci!="":
    for x in range (conc-1):
        soci=raw_input("Tesserato: ")+(";\n")
        f=open("Iscritti.dat","a")
        f.write(soci)
        f.close()
Ed ecco la seconda parte.
Funzione B:

Codice: Seleziona tutto

n_sett=input("Inserire numero settori/concorrenti: ")
foo = range(1,n_sett+1)
random.shuffle(foo)
f=open("Iscritti.dat","r")
for line in f:
    print line,"-".join([str(i)for i in foo])
Ho bisogno del vostro sapere per continuare la stesura del programmino, vi ringrazio in anticipo per l'aiuto.
Ultima modifica di raffaele63 il sabato 31 maggio 2014, 13:13, modificato 1 volta in totale.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
ispaniko7
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 680
Iscrizione: domenica 24 agosto 2008, 21:50
Desktop: gnome-flashback-compiz
Distribuzione: Ubuntu 16.04 LTS

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da ispaniko7 »

Hai già provato ad utilizzare i dizionari di Python?

In pratica associano ad una chiave un valore.

Codice: Seleziona tutto

{chiave:valore}
Non ricordo però i metodi per i dizionari. Oppure guarda le Tuple.

La prima alternativa che mi viene in mente è: In pratica tu hai un file con tutti i nominativi e poi fai partire la funzioene B per generare i numeri casuali da associare ai nomi. Fai un for che scorre tutti i nomi nel file, nella funzione B ad ogni generazione di numeri casuali prendi l'i-esimo numero e lo aggiungi alla linea che stai percorrendo col for (sul file). Forse il problema è che tu volevi i numeri come interi mentre devi per aggiungerli al file devi fare il cast , cioè trasformali in stringhe.

Da intero a stringa: str(numero)
da stringa a intero_ int(numero_stringa).
Posso comandare anche il vento signore, c'è un uragano dentro di me che raderà al suolo ogni cosa se solo oserete sfidarmi.
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da raffaele63 »

Ciao e grazie per la risposta.
Per i dizionari , non mi sembra la strada più corretta. Ho provato con i file e sembra funzionare bene, devo solo capire come abbinare appunto gli uni agli altri.
Se devo essere sincero, non ho ben afferrato il tuo concetto:
prendi l'i-esimo numero e lo aggiungi alla linea che stai percorrendo col for (sul file)
Per un pivellino come me, ancora c'è molto da scoprire, se per favore provi ad esporre in modo semplice.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
ispaniko7
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 680
Iscrizione: domenica 24 agosto 2008, 21:50
Desktop: gnome-flashback-compiz
Distribuzione: Ubuntu 16.04 LTS

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da ispaniko7 »

Non pensare che io sia molto più esperto :)

Tu devi associare un nome ad un numero generato in modo casuale.

Come hai detto nella prima funzione inserisci in un file tutti i nomi. Nella seconda funzione invece generi numeri casuali. Quello che intendo dire è:

Associ ad una variabile il numero delle righe del file contenente i nomi. Infatti se metti ogni nome su ogni riga avrai che il numero delle righe sarà il numero dei partecipanti. Fai scorrere il for sulle righe del file che contiene i nomi. Quindi ad esempio se hai 5 nomi avrai 5 righe nel file, quindi l'indice del for dovrà variare tra 0 e 4. All'interno di questo for hai la funzione per generare i numeri random da 1 alla variabile a cui hai associato il numero dei partecipanti. Ogni volta che scorri una riga,quindi, genererà un numero. Questo lo copierai all'interno del file dei nomi alla riga i-esima , cioè alla riga che stai analizzando col for.

Pseudo-codice:

Codice: Seleziona tutto

n = variabile_contenente_il_numero_dei_partecipanti

for(scorre tutte le righe del file)
     x =  rand(1,n) # Genera numeri casuali da 1 al numero dei partecipanti. 
    copi la variabile x nel file dei nomi convertendolo in una stringa
 
chiudi il file   
Quando aprirai il file avrai: (esempio con 5 nomi):


Marco 3
Anna 1
Daniele 4
Giacomo 5
Alice 4

Un nome e un numero random.

Spero di aver capito bene il tuo problema, e di essere stato più chiaro.

Se ci sono problemi posta pure :)
Posso comandare anche il vento signore, c'è un uragano dentro di me che raderà al suolo ogni cosa se solo oserete sfidarmi.
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da raffaele63 »

Grazie per il suggerimento.
Nell'immediato non riesco ad editare codice, quindi devi avere un pochino di pazienza. Appena scrivo qualche riga di programma ti faccio sapere. Ciao.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
ispaniko7
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 680
Iscrizione: domenica 24 agosto 2008, 21:50
Desktop: gnome-flashback-compiz
Distribuzione: Ubuntu 16.04 LTS

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da ispaniko7 »

Non preoccuparti del tempo, puoi metterci quanto vuoi. Non è un metodo moto veloce ma credo che possa funzionare.
Ripeto che se non ho capito a fondo il tuo problema ti prego di postare così posso/possiamo aiutari.
Ciao!
Posso comandare anche il vento signore, c'è un uragano dentro di me che raderà al suolo ogni cosa se solo oserete sfidarmi.
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, vorrei abbinare un numero ad una lettera

Messaggio da Claudio_F »

Non sono sicuro neanche io della reale necessità, cioè se sia proprio indispensabile scrivere su file, rileggere, riscrivere ecc. Se si tratta solo di acquisire dei nomi e mescolarli viene in aiuto la funzione shuffle del modulo random (da applicare ad una lista di nomi). A quel punto si possono semplicemente scrivere su file con numero progressivo leggendoli dalla lista.
:ciao:
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da raffaele63 »

Ciao Claudio F,
vediamo se ho capito bene:
intendi dire che sarebbe meglio abbinare il metodo random.shuffle, invece che ai numeri, alla lista dei nomi?
E dopo di che, assegnare semplicemente ai nomi dei numeri consecutivi?
Il mio "noviziato" mi rende ancora poco elastico con la logica della programmazione. (comunque dopo ci provo e faccio sapere)
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da raffaele63 »

Rispondo anche a Ispaniko7.
Ciao, ieri sera ho provato a "spataccare" di mia iniziativa, leggendo il tutorial ufficiale di python per trovare una logica conseguenza al mio operato, con qualche piccolo passo in avanti, ma non la soluzione cercata.
Toglimi una curiosità: ma cosa intendi
copi la variabile x nel file dei nomi convertendolo in una stringa
scusa ma non mi è proprio chiaro.
Comunque grazie del tempo che state dedicando.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
ispaniko7
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 680
Iscrizione: domenica 24 agosto 2008, 21:50
Desktop: gnome-flashback-compiz
Distribuzione: Ubuntu 16.04 LTS

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da ispaniko7 »

Non sono sicuro neanche io della reale necessità, cioè se sia proprio indispensabile scrivere su file, rileggere, riscrivere ecc.
No, in effetti non è necessario ma è un modo, piuttosto lento è vero :)

Qui - > http://www.html.it/pag/15617/lavorare-con-i-files/ ci sono le funzione già pronte in Python per lavorare con i file. Quello che intendo dire è che:
La riga di codice:

Codice: Seleziona tutto

x = rand(1,n)
Produce numeri casuali da 1 a un numero n (che nel tuo caso è il numero dei partecipanti). Infatti se fai stampare la variabile x ad ogni chiamata di rand(1,n) vedrai apparire dei numeri. I numeri che verranno stampati sono degli interi (int) che non vanno d'accordo col tipo di file stringhe( contenute nel tuo file). Quindi prima di copiare il numero "x" nel file, devi trasformarlo in una stringa. Come si fa? Così:

Codice: Seleziona tutto

str(x)
. Ora x è una stringa che puoi successivamente copiare al tuo file, vicino al nome del partecipante.

Per scrivere, modificare, cancellare,leggere un file ti rimando al link che spiega meglio di me :)

Se hai ancora problemi posta, non farti problemi, siamo qui apposta. Non voglio scriverti il codice perchè secondo me non si impara se non lo fai con le tue mani. Non è una cattiveria credimi, la programmazione è tutto esercizio. ;)

Ps: Intanto che provi , penso ad un metodo più furbo, magari un po' più veloce.

Ciao !!
Posso comandare anche il vento signore, c'è un uragano dentro di me che raderà al suolo ogni cosa se solo oserete sfidarmi.
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da raffaele63 »

Ciao ispaniko7,
mi trovi pienamente in accordo per non postare codice già fatto e rendere la vita semplice.
La vita non è semplice! Grazie per il link. Appena posso lo consulto.
Per provare ho provato eccome, alcune prove hanno dato esiti che potranno servirmi per altre parti del programma, mentre altri tentativi hanno prodotto obbrobri, comunque ancora grazie per le direttive date.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
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, vorrei abbinare un numero ad una lettera

Messaggio da Claudio_F »

raffaele63 ha scritto: intendi dire che sarebbe meglio abbinare il metodo random.shuffle, invece che ai numeri, alla lista dei nomi?
Tecnicamente mescolare una sequenza A e abbinarla alla sequenza B, o mescolare la sequenza B e abbinarla alla sequenza A produce il medesimo abbinamento casuale. Quello che cambia può essere la comodità (intesa come passaggi da compiere) di un modo o dell'altro, a seconda della forma in cui si trovano i dati che stiamo maneggiando e del risultato finale che vogliamo ottenere. Mi è sembrato più pratico l'ordine progressivo dei nomi mescolati perché è immediato trovare "chi è il primo?" "chi è il quarto?" ecc. Ovviamente se le necessità sono diverse, ad esempio avere i nomi in ordine alfabetico, allora si possono fare valutazioni diverse.
:ciao:
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da raffaele63 »

Ciao,
ho modificato la funzione B come segue:

Codice: Seleziona tutto

n_sett=input("Inserire numero settori/concorrenti: ")
print
foo= range(1,n_sett+1)
random.shuffle(foo)
f=open("Iscritti.dat","r+")
for line in f:
    for x,y in zip(f,foo):
        print ("%s,%s")%(x,y)
ottengo questo risultato (che di per se è un bel passo avanti):

Inserire numero settori/concorrenti: 5

cognomeB
,4
cognomeC
,2
cognomeD
,1
cognomeE
,3
Ovviamente ho inserito 5 cognomi partendo da cognomeA che non compare , ma che è presente all'interno di f. Nel primo messaggio mi hai scritto:
Quindi ad esempio se hai 5 nomi avrai 5 righe nel file, quindi l'indice del for dovrà variare tra 0 e 4
E' qui che risiede l'errore?
Grazie.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
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, vorrei abbinare un numero ad una lettera

Messaggio da Claudio_F »

Siccome non usi indici non può essere un errore di indice ;)
L'errore sta nel fatto che la riga
for line in f:
legge già la prima riga dal file assegnandola alla variabile line (variabile che tra l'altro non viene poi usata)
:ciao:
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: Python, vorrei abbinare un numero ad una lettera

Messaggio da raffaele63 »

Accidenti a me e alla mia foga di scrivere codice!
Scrivo in eccedenza a quanto in realtà possa servire, così finisco per andare oltre le reali necessità del programma.
Comunque adesso sono riuscito, anche grazie alla collaborazione ricevuta, a risolvere il problemino che mi bloccava:

Codice: Seleziona tutto

n_sett=input("Inserire numero settori/concorrenti: ")
print
foo= range(1,n_sett+1)
random.shuffle(foo)
n_sett=str(n_sett)
f=open("Iscritti.dat","r+")
for line,n_sett in zip(f,foo):
    print ("%s %s")%(line,n_sett)
f.close()
Questa è la versione corretta che genera il seguente risultato:

Inserire numero settori/concorrenti: 10

Mxxxxx Marzia
2
Gxxxxx Giancarlo
10
Txxxxx Genesio
6
Txxxxx Dina
3
Zxxxxx Marco
7
Axxxxx Cristina
4
Bxxxxx Rossana
1
Bxxxxx Daniela
5
Pxxxxx Angela
8
Ixxxxx Erminio
9
I cognomi sono volutamente ixsati, ma posso dire con piacere RISOLTO.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: [Risolto] Python: vorrei abbinare un numero ad una lette

Messaggio da Claudio_F »

Bene, ora siccome non siamo in C dove bisogna rigidamente specificare tutto dall'inizio, si può togliere la richiesta del numero concorrenti (che pensandoci non riguarda strettamente il lavoro da svolgere, ma è un' inutile incombenza di cui si deve fare carico l'operatore a causa del sottostante funzionamento del programma). Immagina di dover caricare mille concorrenti, e al 999 arriva la telefonata che uno si è ritirato :p

Preferirei inserire dati finché serve e poi comunicare in qualche modo "ho finito!", allo stesso modo per l'abbinamento il programma potrebbe capire da solo quante righe sono state caricate in precedenza. Suggerimento: con len si può ottenere la lunghezza di qualsiasi sequenza.
:ciao:
raffaele63
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 348
Iscrizione: lunedì 3 ottobre 2011, 12:27
Desktop: Lubuntu
Distribuzione: Lubuntu 22.04.1 LTS (Jammy Jellyfis
Sesso: Maschile

Re: [Risolto] Python: vorrei abbinare un numero ad una lette

Messaggio da raffaele63 »

Ciao Claudio_F,
allora diciamo che sotto questo aspetto non l'avevo osservato, anche perché, collego i dati ad un database. All'interno, ho tabelle e colonne apposite dove memorizzarli e quindi indicare primary key ecc., per una eventuale necessità di confronto.
Diciamo che per lo specifico tipo di gare usate come base (pesca in acque interne), anche se manca una persona resta un buco nel settore di assegnazione, ma giustamente per altre tipologie di gare potrebbe essere rilevante. In effetti, potrei cercare un sistema di inserimento diverso, magari utilizzando "while" con esc o quit. L'idea di "len" mi piace, perché posso sapere quanto è lunga la lista di nomi e applicarla con una funzione al sorteggio dei numeri da 1 a "len".
Ci lavoro sopra e siccome, servirà presumibilmente aiuto, ci ritroveremo su queste utili pagine del forum.
Bisognerebbe evitare di predicare ai giovani il successo nella solita forma come lo scopo principale nella vita.
Il motivo più importante per lavorare a scuola e nella vita è il piacere nel lavoro, piacere nel suo risultato e la conseguenza del valore del risultato per la comunità. ( A.E. )
ispaniko7
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 680
Iscrizione: domenica 24 agosto 2008, 21:50
Desktop: gnome-flashback-compiz
Distribuzione: Ubuntu 16.04 LTS

Re: [Risolto] Python: vorrei abbinare un numero ad una lette

Messaggio da ispaniko7 »

Scusa se sono stato assente ma avevo da fare, meno male che ci sono altri bravi utenti che ti hanno aiutato. Bene che hai risolto !!

Se hai bisogno non farti problemi a postare :)
Posso comandare anche il vento signore, c'è un uragano dentro di me che raderà al suolo ogni cosa se solo oserete sfidarmi.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti