Topic: Ordinamento file txt  (Letto 136 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline crynow

  • python unicellularis
  • *
  • Post: 9
  • Punti reputazione: 0
    • Mostra profilo
Ordinamento file txt
« il: Settembre 10, 2020, 16:58 »
Buonasera, ho un esercizio che mi chiede di leggere un file txt e ordinarlo in base a una parola.

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 279
  • Punti reputazione: 0
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #1 il: Settembre 11, 2020, 08:05 »
Buonasera, ho un esercizio che mi chiede di leggere un file txt e ordinarlo in base a una parola.

... Quindi? Hai provato a farlo? Se si cosa hai fatto che non è riuscito?

Che Te lo facciano gli altri a Te non serve a niente, comunque, posto un file "filastrocche.txt" con questo contenuto :
zP:~$ cat filastrocche.txt
Tanto va la gatta al lardo ...
Apelle figlio di Apollo ...
Amacacà cicì cocò tre civette sul comò ...
NzP:~$


lo leggi così:
>>> with open('filastrocche.txt', 'r') as f:
rows = f.read().splitlines()


>>> rows
['Tanto va la gatta al lardo ...', 'Apelle figlio di Apollo ...', 'Amacacà cicì cocò tre civette sul comò ...']


puoi ordinarne le righe in base alle stringhe con sort
>>> rows.sort()
>>> rows
['Amacacà cicì cocò tre civette sul comò ...', 'Apelle figlio di Apollo ...', 'Tanto va la gatta al lardo ...']
>>>


puoi definirne una chiave di ordinamento in vari modi, magari, per ordinarlo in base alla seconda parola di ogni singola riha si può fare così:
>>> def second_word(row):
words = row.split(' ')
return words[1]

>>> rows.sort(key=second_word)

nel caso, avresti l'ordinamento precedente, comunque divertiti con varianti per provare.

Ciò che Ti ho scritto sopra, però, richiede un bel po' di approfondimenti per capirne le implicazioni e l'utilizzo.

Offline crynow

  • python unicellularis
  • *
  • Post: 9
  • Punti reputazione: 0
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #2 il: Settembre 11, 2020, 09:08 »
E invece se lo dovrei fare in base a due parole cioè:

aria,ciao,5
aria,aria,5
aria,aria, 4

prima in base alla seconda lettera e a parità di questa per la terza parola cioè il numero

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 279
  • Punti reputazione: 0
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #3 il: Settembre 11, 2020, 09:29 »
>>> vox = '''aria,ciao,5
aria,aria,5
aria,aria,4'''
>>> rows = vox.splitlines()
>>> rows
['aria,ciao,5', 'aria,aria,5', 'aria,aria,4']
>>> def multi_sort(row):
voices = row.split(',')
return voices[1] + voices[2]

>>> rows.sort(key=multi_sort)
>>> rows
['aria,aria,4', 'aria,aria,5', 'aria,ciao,5']
>>>

Offline crynow

  • python unicellularis
  • *
  • Post: 9
  • Punti reputazione: 0
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #4 il: Settembre 11, 2020, 11:45 »
Prima cosa grazie che mi stai aiutando.

Se vorrei fare il secondo ordinamento in senso decrescente, come dovrei fare nel senso:

aria, ciao, 5
aria, aria, 6
aria,aria,5

prima per la seconda parola in ordine alfabetico e poi per la terza parte cioè il numero ma in senso decrescente:

aria,aria,6
aria,aria,5
aria,ciao,5

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 279
  • Punti reputazione: 0
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #5 il: Settembre 11, 2020, 11:58 »
Prima cosa grazie che mi stai aiutando....
In realtà NON ti sto aiutando, è il contrario, ti ostacolo di questo passo.

se leggi il Sorting How To o, meglio ancora, la documentazione vedrai che sort ha la chiave "reverse" cui si associa un valore booleano, impostata a "Vero" l'ordinamento viene invertito, pertanto Ti basta inserire "reverse=True" nella istruzione sort.

Per imparare è necessario leggere documentazione-manuali-libri, farsi idee, provarle e ritentare, se poi non si riesce si chiede aiuto, certo, ma non si può imparare senza "studiare" e "provare", te lo assicuro per averne perso tantissimo di mio.

Offline crynow

  • python unicellularis
  • *
  • Post: 9
  • Punti reputazione: 0
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #6 il: Settembre 11, 2020, 12:46 »
Certo so quello che vuoi dire ma sul mio manuale di ordinamento ne parla pochissimo ecco perchè ho chiesto aiuto, comunque ho provato a mettere 'reverse=True' ma non va forse ho sbagliato a scrivere qualcosa, perchè se scrivo 'reverse=True' nel rigo del sort anche il secondo elemento mi va in modo descrescente invece solo il terzo elemento deve andare in senso decrescente cioè solo il numero:

inputfile = open("manutenzioni.txt", "r")
outputfile = open("manutenzioni_ordinate.txt", "w")

Lista = inputfile.read().splitlines()

def multi_sort(Lista) :
    voices = Lista.split(',')
    return voices[3] + voices[6]
   
   
Lista.sort(key=multi_sort)


print(Lista)

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 279
  • Punti reputazione: 0
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #7 il: Settembre 11, 2020, 17:45 »
... anche il secondo elemento mi va in modo descrescente invece solo il terzo elemento deve andare in senso decrescente cioè solo il numero:...

Ah! ... questo è un attimino più complicato e non avevo compreso il quesito, ora che non sono al lavoro posso dare più di una breve guardata.

In primo luogo, il problema "numeri", perché i numeri vengano ordinati correttamente bisogna trattarli come tali, altrimenti un numero che inizia con "1" precederà sempre un numero che inizia con "2", bisogna provvedersi di trattare anche le singole righe come liste ... facciamo un esempio leggermente più articolato di quello che hai proposto :

>>> vox = '''aria,terra,123
aria,aria,7
aria,fango,98
aria,terra,35
aria,terra,91
aria,fango,64
aria,aria,51'''
>>> rows = [[int(y) if y.isdigit() else y for y in x.split(',')] for x in vox.splitlines()]
>>> rows
[['aria', 'terra', 123], ['aria', 'aria', 7], ['aria', 'fango', 98], ['aria', 'terra', 35], ['aria', 'terra', 91], ['aria', 'fango', 64], ['aria', 'aria', 51]]

Non so se Tu conosca già le listcomprehensions, per brevità, ho utilizzato quella tecnica per produrre una lista di liste con un numero al terzo elemento.

a questo punto potremmo discriminare l'ordinamento sul secondo e terzo campo, magari utilizzando una funzione lamba, in questo modo

>>> rows.sort(key=lambda x: (x[1], -x[2]))
>>> rows
[['aria', 'aria', 51], ['aria', 'aria', 7], ['aria', 'fango', 98], ['aria', 'fango', 64], ['aria', 'terra', 123], ['aria', 'terra', 91], ['aria', 'terra', 35]]

ove avremo messo il campo numerico come negativo, per ordinalo in maniera decrescente.

qualora, poi Ti occorra overe una lista di stringhe, quale risultato, con una nuova comprehensions
>>> rows = [','.join([str(y) for y in x]) for x in rows]
>>> rows
['aria,aria,51', 'aria,aria,7', 'aria,fango,98', 'aria,fango,64', 'aria,terra,123', 'aria,terra,91', 'aria,terra,35']
>>>

che potrai, magari, riscrivere in un file.

... certo, quanto su, pur essendo "base", richiede un po' di studio e, pur avendo studiato i vari comandi esposti, pure pensarci su e provare un po'.

Ciao

Offline crynow

  • python unicellularis
  • *
  • Post: 9
  • Punti reputazione: 0
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #8 il: Settembre 11, 2020, 18:08 »
c'è un problema però

perchè il segno meno da errore

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.083
  • Punti reputazione: 9
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #9 il: Settembre 11, 2020, 19:04 »
Scusa, vorrei segnalarti che fin qui non ti abbiamo ancora visto postare neanche una riga di codice.
Magari anche un minimo sforzo da parte tua non guasterebbe, vero? Sai, alla fine saresti poi tu quello che deve risolvere l'esercizio.
Fai almeno un esempio di cosa intendi per "dà errore"...


(@nunzio... quel "isdigit" è davvero un po' troppo ottimistico... ci sono cose che non puoi risolvere bene ficcandole a forza in una list comprehension... scrivi un ciclo e usa un try/except per testare i numeri.... oppure, meglio ancora, non testare proprio niente e assumi che i numeri si trovino sempre in terza posizione... che è la cosa che si fa in genere in questi casi)

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 279
  • Punti reputazione: 0
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #10 il: Settembre 11, 2020, 19:29 »
...
(@nunzio... quel "isdigit" è davvero un po' troppo ottimistico...

Vero  :angry: la comprension era solo per "sbrigarmi" e "isdigit()" lo uso pochissimo, non me ne ero mai accorto del segno.

Per lo OP, correzione volante

Type "help", "copyright", "credits" or "license()" for more information.
>>> vox = '''aria,terra,123
aria,aria,7
aria,fango,98
aria,terra,35
aria,terra,-91
aria,fango,64
aria,aria,51'''
>>> rows = [[int(y) if y.lstrip('-').isnumeric() else y for y in x.split(',')] for x in vox.splitlines()]
>>> for r in rows:
print(r)


['aria', 'terra', 123]
['aria', 'aria', 7]
['aria', 'fango', 98]
['aria', 'terra', 35]
['aria', 'terra', -91]
['aria', 'fango', 64]
['aria', 'aria', 51]
>>> rows.sort(key=lambda x: (x[1], -x[2]))
>>> for r in rows:
print(r)


['aria', 'aria', 51]
['aria', 'aria', 7]
['aria', 'fango', 98]
['aria', 'fango', 64]
['aria', 'terra', 123]
['aria', 'terra', 35]
['aria', 'terra', -91]
>>>

Offline crynow

  • python unicellularis
  • *
  • Post: 9
  • Punti reputazione: 0
    • Mostra profilo
Re:Ordinamento file txt
« Risposta #11 il: Settembre 17, 2020, 17:53 »
Grazie a tutti