Topic: Fare delle liste  (Letto 375 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Simon Danny Pettinella

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Fare delle liste
« il: Novembre 12, 2019, 23:25 »
Ciao!

Da un file di testo che adesso cercherò di allegare devo estrarre la voce relativa agli anni e quella relativa al numero.
Dopodiché devo creare una lista che associ ad ogni anno il numero di incendi così da avere un risultato simile:
2000 : 5
2001 : 18
2002 : 9
ecc...

Io finora sono riuscito a scrivere solo questo:

file = open('areeincendiate.txt')
lista1 = []                             #anni (2003.....)
lista2 = []                             #n. incendi (0.....)
lista3 = []
x,y = 0
for line in file:
    sline = line.split(';')
    lista.append([sline[0], sline[10]])

lista1
  •                                #associo le prime due liste alle 2 variabili x(anno) e y(incendio)

lista2[y]

for n in lista1
if list1
  • != list1[x+1]               #!= not equal to, quindi se 2003 è diverso da 2004

  return lista1

else
list2[y] = list2[y] + list2 [y+1]

lista3[] = lista1 + lista2              #(2003 10)
print(lista3)



Qualcuno sa aiutarmi?

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.112
  • Punti reputazione: 9
    • Mostra profilo
Re:Fare delle liste
« Risposta #1 il: Novembre 13, 2019, 09:20 »
Sì beh, questo però non è codice python, sono parole in libertà.
Tra l'altro è buffo, ma sembra che tu stia scrivendo codice su... Word, può essere?, per cui ogni volta che premi il tasto del tabulatore Word inserisce un "punto elenco"... 

Uhm.
Su che libro stai studiando?

Offline Simon Danny Pettinella

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Fare delle liste
« Risposta #2 il: Novembre 13, 2019, 12:48 »
Ho usato blocco note.
Sì è solo uno pseudocodice che mi sono scritto per tenere il ragionamento a mente.
Studio su diversi supporti, un video corso, un libro apogeo e... Internet.

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 294
  • Punti reputazione: 0
    • Mostra profilo
Re:Fare delle liste
« Risposta #3 il: Novembre 13, 2019, 13:52 »
Ho usato blocco note.
Sì è solo uno pseudocodice che mi sono scritto per tenere il ragionamento a mente.
Studio su diversi supporti, un video corso, un libro apogeo e... Internet.

... Ah, è studio e pseudo-codice allora.

Sul Tuo quesito mi son divertito ad ipotizzare una struttura dati pseudo-csv ed a tirar fuori dizionari e liste di liste tramite metodi comprehensions, in python sono un iniziando come Te, non ho postato nulla non sapendo cosa in realtà a Te serva.

In merito a quali aspetti Ti occorre aiuto?

[Edit] P.S. : se usi windows, utilizza meglio Notepad++ come editor per iniziare o direttamente IDLE (suppongo che anche nelle versioni windows possa creare files)
« Ultima modifica: Novembre 13, 2019, 14:00 da nuzzopippo »

Offline Simon Danny Pettinella

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Fare delle liste
« Risposta #4 il: Novembre 16, 2019, 16:55 »
Ciao e grazie per le risposte.
Da questo file di testo devo ricavare un risultato del genere:

2003 : xxxxxxxxxxxxx
2004 : xxxxxxxxxxxxxxxxxxxx
2005 : xxxxx

dove le x rappresentano  il numero degli incendi

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 294
  • Punti reputazione: 0
    • Mostra profilo
Re:Fare delle liste
« Risposta #5 il: Novembre 16, 2019, 21:32 »
Da questo file di testo devo ricavare un risultato del genere:

"Questo file" non lo vedo, per darTi una risposta coerente alla Tua problematica non sarebbe stato male conoscere i dati che vuoi "trattare"
 .... dal tenore del Tuo post mi sembra di comprendere che stai utilizzando dei dati di tipo CSV, ove l'anno è il primo campo (indice 0 ) ed il numero ad indice 10 e che, for se non hai ben chiaro come poter procedere... Ti propongo l'esempio che mi son divertito a fare, fermo restando che ci sono librerie specializzate per trattare i CSV, sperando possa esserTi utile.

supposto un file contenente dati pseudo-csv così fatto :
>>> f = open('aree_incendiate', 'r')
>>> r = f.read().splitlines()
>>> f.close()
>>> for ri in r:
   print(ri)

   
2000;comune1;provincia1;testo3;testo4;testo5;testo6;testo7;testo8;testo9;2;testo11;
2000;comune1;provincia1;testo3;testo4;testo5;testo6;testo7;testo8;testo9;3;testo11;
2001;comune1;provincia1;testo3;testo4;testo5;testo6;testo7;testo8;testo9;8;testo11;
2001;comune2;provincia1;testo3;testo4;testo5;testo6;testo7;testo8;testo9;5;testo11;
2001;comune3;provincia1;testo3;testo4;testo5;testo6;testo7;testo8;testo9;5;testo11;
2002;comune1;provincia1;testo3;testo4;testo5;testo6;testo7;testo8;testo9;4;testo11;
2002;comune4;provincia1;testo3;testo4;testo5;testo6;testo7;testo8;testo9;5;testo11;

(qui vedi un esempio di lettura di file di testo)

Utilizzando un dizionario con gli anni come chiavi, potremmo ottenere il risultato da Te voluto con una unica riga di codice :
>>> dict_inc = {ri: sum([int(y.split(';')[10]) for y in r if y.split(';')[0] == ri]) for ri in set([z.split(';')[0] for z in r])}
>>> print(dict_inc)
{'2001': 18, '2002': 9, '2000': 5}
>>> for key in sorted(dict_inc.keys()):
   print(key, ':', dict_inc[key])

   
2000 : 5
2001 : 18
2002 : 9
>>> dict_inc['2001']
18

Nel caso si volesse una lista di liste, o di tuple, le variazioni sarebbero minime ... ad esempio, x liste
>>> lista_inc = [[ri, sum([int(y.split(';')[10]) for y in r if y.split(';')[0] == ri])] for ri in set([z.split(';')[0] for z in r])]
>>> for l in lista_inc:
   print(l)

   
['2001', 18]
['2002', 9]
['2000', 5]
>>>


Ho il dubbio che è possibile Tu non conosca ancora le metodologie delle comprehension's, cerco di "tradurre" in codice base, nell'ambito delle istruzioni ho utilizzato alcune funzioni bultin, (set e sum)), traduco quest'ultimo esempio delle liste.

Partendo dalla lista di righe come prodotta dal primo blocco di codice potremmo fare :
>>> tz = []
>>> for z in r:
   tz.append(z.split(';')[0]) # <-- inserisco gli anni in una lista

   
>>> tz
['2000', '2000', '2001', '2001', '2001', '2002', '2002']
>>> lista_to_ri = []          # <-- lista dati singolo anno
>>> altra_lista_inc = []      # <-- lista contenitore delle elaborazioni
>>> for ri in set(tz):        # <-- definisco un insieme degli anni (diventano unici)
   lista_to_ri.append(ri)         # <-- aggiungo l'anno
   somma = 0
   for y in r:               
      if y.split(';')[0] == ri: 
         somma += int(y.split(';')[10])   # <-- leggo il 10° campo e sommo
   lista_to_ri.append(somma)              # <-- aggiungo la somma incendi
   altra_lista_inc.append(lista_to_ri)    # <-- aggiungo i dati anno alla lista contenitore
   lista_to_ri = []                       # <-- svuoto la lista anno

   
>>> for elem in altra_lista_inc:          # <-- stampo i dati per anno
   print(elem)

   
['2002', 9]
['2000', 5]
['2001', 18]
>>>


Spero che Ti sia utile ... Ti consiglio, però, se stai studiando "per imparare" di impostare un discorso coerente su di un testo e farli da Te gli esercizi, con calma e pensandoci su, per esperienza direi che è il solo modo di imparare, ciò che è suggerito si dimentica subito.

[Edit] riletto 'sta mattina, corretto un errore "tipografico" ed il commento sull'aggiunta anno nell'ultimo blocco, posizionato su punto errato.
« Ultima modifica: Novembre 17, 2019, 07:44 da nuzzopippo »