Re: [Python] modo furbo per trovare pattern differenti in una stringa
On 13/02/24 14:32, Perini Matteo wrote: Ciao a tutti, è da un po' che non scrivo. Vi chiedo aiuto perchè sto cercando di leggere delle coordinate da un file Gcode. [...] Vorrei anche attribuire un nome al gruppo identificato in modo da usarlo come dizionario. Ciao, se ho capito bene qualcosa così dovrebbe andare: import re origin =""";LAYER:1 ;MESH:untitled.stl G0 F7200 X1298 Y1798 Z4 ;TYPE:WALL-OUTER G1 F1800 X702 Y1798 E1494.81223 G1 X702 Y1202 E2242.21834 G92 E0 G1 X1298 Y1202 E747.40611 G1 Y1798 X1298 E1494.81223 ;TIME_ELAPSED:177.752007 ;CHANGE; ;LAYER:2 ;MESH:untitled.stl G0 F7200 X1298 Y1798 Z6 ;TYPE:WALL-OUTER G1 F1800 X702 Y1798 E2242.21834 G92 E0 G1 X702 Y1202 E747.40611""" pattern = re.compile(r"([EFXYZ])(\d+\.?\d*)") for linea in origin.splitlines(): if not linea.startswith(';'): print(dict(pattern.findall(linea))) -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Digest di Python, Volume 171, Numero 10
Il 13/05/20 16:46, Paolo Miniussi ha scritto: Dunque stavo riguardando l'espressione proposta da Pietro e direi che l'uso del ? non è contemplabile poiché non ci sono parti facoltative. Stand by PM Ciao, l'uso del ?, in questo caso, non indica parte facoltativa. Se dai uno sguardo a https://docs.python.org/3/library/re.html troverai la spiegazione di (?<=...) e (?=...) Ciao -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Dove sbaglio?
Il 30/04/20 19:53, Marco Beri ha scritto: [...] La funzione zip fa questo: >>> list(zip([1,2,3], ['a', 'b', 'c'])) [(1, 'a'), (2, 'b'), (3, 'c')] Passandogli un parametro con l'* in pratica gli facciamo fare il contrario: >>> list(zip(*[(1, 'a'), (2, 'b'), (3, 'c')])) [(1, 2, 3), ('a', 'b', 'c')] Ma nel tuo caso lei fa il suo dovere, dobbiamo invece modificare il comportamento della funzione sorted: >>> ritardo_numeri_singoli_ordine_decrescente , numeri_singoli_in_ordine = zip(*sorted(zip(ritardo_numeri_singoli, riepilogo_numeri_singoli), key=lambda x:(x[0],-x[1]), reverse=True)) >>> ritardo_numeri_singoli_ordine_decrescente (55, 55, 53, 53, 52, 50, 49, 47, 45, 44, 41, 40, 39, 38, 34, 33, 32, 30, 29, 26, 25, 22, 22, 21, 20, 18, 13, 12, 11, 7, 6, 5, 4, 3, 2, 1, 0) >>> numeri_singoli_in_ordine (10, 36, 12, 32, 14, 26, 13, 11, 30, 21, 17, 24, 27, 15, 3, 23, 33, 8, 18, 22, 35, 0, 9, 29, 4, 2, 25, 16, 20, 5, 34, 19, 28, 31, 6, 7, 1) In pratica diciamo alla funzione sorted di usare per l'ordinamento inverso il primo numero così com'è (il ritardo) e il secondo numero al contrario. In alternativa potevamo dirgli di non fare l'ordine inverso e invertire il primo, il risultato non cambia: >>> ritardo_numeri_singoli_ordine_decrescente , numeri_singoli_in_ordine = zip(*sorted(zip(ritardo_numeri_singoli, riepilogo_numeri_singoli), key=lambda x:(-x[0],x[1]))) >>> ritardo_numeri_singoli_ordine_decrescente (55, 55, 53, 53, 52, 50, 49, 47, 45, 44, 41, 40, 39, 38, 34, 33, 32, 30, 29, 26, 25, 22, 22, 21, 20, 18, 13, 12, 11, 7, 6, 5, 4, 3, 2, 1, 0) >>> numeri_singoli_in_ordine (10, 36, 12, 32, 14, 26, 13, 11, 30, 21, 17, 24, 27, 15, 3, 23, 33, 8, 18, 22, 35, 0, 9, 29, 4, 2, 25, 16, 20, 5, 34, 19, 28, 31, 6, 7, 1) Ok, confesso che è un po' complicato (le funzioni lambda sono un pochino avanzate), però anche quello che vuoi fare tu lo è. Ciao. Marco. Ovviamente questa soluzione+spiegazione di Marco è preferibile, però dai, c'eri quasi: numeri = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36] ritardo = [22, 0, 18, 34, 20, 7, 2, 1, 30, 22, 55, 47, 53, 49, 52, 38, 12, 41, 29, 5, 11, 44, 26, 33, 40, 13, 50, 39, 4, 21, 45, 3, 53, 32, 6, 25, 55] numeri_in_ordine = [] ritardo_dec = sorted(ritardo, reverse=True) posizione = 0 for ordine in range(len(ritardo_dec)): if ordine > 0 and ritardo_dec[ordine] == ritardo_dec[ordine - 1]: non_trovato = True while non_trovato: # sostituito il True if ritardo_dec[ordine] == ritardo[posizione + 1]: # posizione = ritardo.index(ritardo_dec[posizione + 1]) numeri_in_ordine.insert(ordine, numeri[posizione + 1]) # aggiunto +1 non_trovato = False else: posizione += 1 else: posizione = ritardo.index(ritardo_dec[ordine]) numeri_in_ordine.insert(ordine, numeri[posizione]) print() print(numeri) print(ritardo) print() print(numeri_in_ordine) print(ritardo_dec) ciao -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] (senza oggetto)
Il 30/04/20 14:11, Marco Beri ha scritto: On Thu, Apr 30, 2020 at 2:07 PM Paolo Miniussi mailto:miniussipa...@gmail.com>> wrote: Buongiorno molto piacere Paolo. Sono iscritto alla list di Python e ho visto che in questi giorni state trattando l'argomento relativo al conteggio delle parole. Ho un problema specifico relativo all'estrazione di alcune stringhe che seguono altre stringhe. In pratica ho un testo tipo questo: lunghezza legno: 1000 cm peso del tronco: 34 kg tempo di lavorazione: 11 ore 57 minuti Praticamente devo estrarre ciò che viene dopo le singole definizioni. Quindi per la prima riga devo prelevare la stringa "1000 cm" , per la seconda "34 kg" e via così (poi dovrò eventualmente capire se prendere solo il valore numero oppure tutta la stringa). Ho approcciato il problema usando lo slice e quindi tagliando le porzioni di stringa desiderate per poi successivamente trasformarle in variabili. Il problema è che il mio file di log che contiene queste informazioni da estrarre può ovviamente variare di lunghezza e quindi lo slice va a farsi benedire. Per spiegarmi, il valore della "lunghezza legno:" invece di essere 1000 cm può diventare 123000 cm quindi il taglio in slice mi troncherebbe il dato. Stavo cercando di cambiare approccio e quindi di prelevare i dati prendendo tutto quello che viene dopo una data stringa e prima di quella successiva. Avete qualche suggerimento? La soluzione per te sono le regular expression: >>> testo = """lunghezza legno: 1000 cm ... peso del tronco: 34 kg ... tempo di lavorazione: 11 ore 57 minuti""" >>> testo 'lunghezza legno: 1000 cm\npeso del tronco: 34 kg\ntempo di lavorazione: 11 ore 57 minuti' >>> import re >>> re.findall(r"\s(\d+)\b\s*(\w+)", testo) [('1000', 'cm'), ('34', 'kg'), ('11', 'ore'), ('57', 'minuti')] Potrei consigliarti un buon testo sulle regex ma sarei in conflitto di interessi (e poi trovi comunque una marea di tutorial su web) :-D Ciao. Marco. Elegante come soluzione però incorretta perché il "tempo di lavorazione" viene spezzato in "11 ore" e "57 min". Forse uno split() sulla singola riga è più indicato. ciao -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] Dove sbaglio?
Il 30/04/20 01:41, Marco Beri ha scritto: On Thu, Apr 30, 2020 at 1:16 AM Carpediem <mailto:i.carped...@tiscali.it>> wrote: Un saluto a tutti e un grazie anticipato al volenteroso che avrà avuto la pazienza e la capacità di darmi una soluzione. Stavo cercando di darti una mano ma poi ho realizzato lo scopo (credo) che c'è dietro al tuo script. Siccome da giovane sono già passato da questa illusione ti do questo suggerimento: https://www.frasicelebri.it/frase/ii-lotto-e-la-tassa-degli-imbecilli/ Lascia perdere, le palline non hanno memoria. Ciao. Marco. Concordo. Per la soluzione ti suggerisco di guardare dict(), zip() e sorted(); con una sola linea di codice risolvi il problema. Nel merito: hai un ciclo `while True` senza alcuna clausola d'uscita. Suggerimento: usa etichette più concise, ne beneficerà la lettura. Ciao -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
Re: [Python] venv + Debian
Grazie Daniele per le risposte Il 15/03/20 06:18, Daniele Tricoli ha scritto: On Thu, Mar 12, 2020 at 11:18:21AM +0100, Alessandro T. wrote: [...] * è possibile ripristinare l'ambiente al precedente 3.7? copiare il vecchio python3.7 non è stato sufficiente, magari c'è una qualche procedura... al momento non è un grosso problema: per quei progetti con moduli aggiunti creo nuovi ambienti con '--copies' e sistemo le dipendenze. (grazie quarantena) Fossi nei tuoi panni, semplicemente distruggerei il virtualenv e lo ricreerei con l'interprete che mi serve. Però la variabile PATH viene aggiornata quando fai il source dello script activate, quindi puoi guardare lì. In ogni caso te lo sconsiglio, IMO non ne vale proprio la pena. HTH, Si si, ricreare la virtualenv non è un problema. Anche lasciare symlinks per non gestire gli aggiornamenti di sicurezza a mano effettivamente non è da sottovalutare. Alla fine modificherò il mio workflow solo con un bel `(venv)$ pip freeze > pip.moduli` finale per tenere traccia dei moduli installati, così mi evito di po' di noia. Grazie ancora, ciao -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
[Python] venv + Debian
Ciao ML, affascinato dalla separazione tra sistema e ambiente di sviluppo ho iniziato ad usare venv; principalmente perché presente nella standard library e perché la procedura di upgrade sembra piuttosto semplice. Quindi, per ogni nuovo progetto un bel: python3 -m venv venv source venv/bin/activate [pip ... ] ... deactivate convinto che non ci sarebbe stata alcuna modifica all'ambiente virtuale senza il mio esplicito intervento. Così è stato fino all'altro giorno, quando ho aggiornato da 3.7 a 3.8. Tutti gli script funzionano, tranne i meno utilizzati e incidentalmente quelli in cui ho installato moduli aggiuntivi. A questo punto mi sono reso conto che `python3 -m venv venv` crea in `venv/bin`, in particolare, il link `python3 -> /usr/bin/python3`! Ma dove va a finire la separazione tra ambienti? Mi sono detto. Un bel `python3 -m venv -h` ha diradato un po' di nebbia: nella mia configurazione il default è il symlinks! Quindi qualche domanda: * la scelta di symlinks è una prerogativa di Debian? per risparmiare 10MB? ha qualche senso più profondo? * per i prossimi progetti `python3 -m venv --copies venv` sarà sufficiente? * dov'è possibile cambiare il comportamento predefinito da symlinks a copies? * è possibile ripristinare l'ambiente al precedente 3.7? copiare il vecchio python3.7 non è stato sufficiente, magari c'è una qualche procedura... al momento non è un grosso problema: per quei progetti con moduli aggiunti creo nuovi ambienti con '--copies' e sistemo le dipendenze. (grazie quarantena) Grazie -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it https://lists.python.it/mailman/listinfo/python
[Python] / nella firma di funzione
Ciao a tutti, sicuramente non sono il primo ad aver notato una una '/' alla fine della firma di una funzione nell'help, di una sessione interattiva, che però manca nella versione "web" della stessa. Esempio: sum >>> help(sum) sum(iterable, start=0, /) mentre: https://docs.python.org/3/library/functions.html?highlight=sum#sum Allora: Cosa significa questa '/' ? Perché è presente solo in help()? Grazie -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Stampare testo barrato
On 30/01/2017 21:37, Francesco Maida wrote: > > ..ma nel caso ti possa andare bene anche una piccola libreria Python > per agevolarti nella scrittura, volevo solo dirti che blessing è tua > amica ^^ > > https://pypi.python.org/pypi/blessings/ > Grazie per l'informazione. Per chi fosse interessato: il problema non sta in python ma nel terminale che compone i caratteri nell'ordine sbagliato. Infatti xterm visualizza come per Alessandro Pisa, che ringrazio, mentre il terminale che uso solitamente inverte l'ordine. Ora mi resta da capire se è un problema di configurazione, comune a xfce4-terminal, lxterminal e gnome-terminal, oppure, come dicono alcuni, una feature. Ciao -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Stampare testo barrato
On 30/01/2017 18:58, Esalando Prassi wrote: > [...] > > Boh, non credo di aver capito bene cosa non funzioni quello che ti ho > proposto. http://imgur.com/rZsxT4K > > Ad ogni modo, puo' esserti utile fare un salto su SO: > > - > http://stackoverflow.com/questions/25244454/python-create-strikethrough-strikeout-overstrike-string-type Sì è da dove sono partito Ciao -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Stampare testo barrato
On 30/01/2017 16:36, Esalando Prassi wrote: > 2017-01-30 16:12 GMT+01:00 Alessandro T. : >> Ciao a tutti, >> >> esiste un modo semplice per scrivere del testo barrato sul terminale? >> Ho provato combinando i caratteri con u+0336, ma il risultato non è >> soddisfacente (almeno sul mio terminale): >> >> print('1\u03362') >> # 12 con il 2 barrato - ok >> print(' \u03362') >> # 2 con il 2 barrato - ok >> print('\u03362') >> # 2 - non va bene >> >> Suggerimenti? >> > Probabilmente c'e' di meglio, ma se sei alla frutta... > >>>> print('\u0336'.join('barrato')+'\u0336') > b̶a̶r̶r̶a̶t̶o̶ > > Ciao! Ciao, è proprio da dove sono partito, ma per semplificare al massimo ho tolto la join() e usato due caratteri. La rappresentazione della stringa, in modalità interattiva, è corretta ma poi la print() ... L'unica soluzione che ho trovato, ma non soddisfacente, è d'anteporre uno spazio. Grazie comunque -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] Stampare testo barrato
Ciao a tutti, esiste un modo semplice per scrivere del testo barrato sul terminale? Ho provato combinando i caratteri con u+0336, ma il risultato non è soddisfacente (almeno sul mio terminale): print('1\u03362') # 12 con il 2 barrato - ok print(' \u03362') # 2 con il 2 barrato - ok print('\u03362') # 2 - non va bene Suggerimenti? Grazie -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] argparse e opzioni mutualmente esclusive
On 12/11/2015 17:47, Luca wrote: > Non so se ho capito bene, ma mi sentirei di consigliarti > ArgParseInator (https://pypi.python.org/pypi/ArgParseInator) che > comunque usa anche i subparser > > Il giorno mer 11 nov 2015 alle ore 18:12 Manlio Perillo > mailto:manlio.peri...@gmail.com>> ha scritto: > > 2015-11-11 18:02 GMT+01:00 Alessandro T. <mailto:taglia...@yahoo.it>>: > [...] > > > > Alla fine sto cercando di ottenere una cosa tipo "[-n N] [[-r] q > | -u]" > [...] > > Usa subparser! > [...] > E personalemente odio quando una opzione *non è* opzionale, > Grazie ad entrambi. Alla fine ho seguito l'implicito consiglio di Manlio: le opzioni sono opzioni usale come tali! Ho usato la mutua esclusione ottenendo "[-r] [-q Q | -u]" per poi modificare la stringa dell'help con argparse.ArgumentParser(usage='... [[-r] -q Q | -u] ...' e a posteriori gestendo l'opzione "-r" per farla figurare opzionale all'opzione "-q" :-D Ciao -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] argparse e opzioni mutualmente esclusive
Ciao ML, sto cercando di condensare alcuni script di manutenzione in uno unico, razionalizzando l'interfaccia, e per l'occasione vorrei utilizzare argparse per la gestione della CLI. Due di questi script sono mutualmente esclusivi: il primo ha un'interfaccia tipo "[-r] q" e il secondo "-u"; oltre a altri parametri. Ce n'è un terzo che se richiamato con un particolare valore va a escludere comunque l'eventuale presenza dei parametri dei primi due, ma in genere è un'opzione e della sua gestione me ne occupo a posteriori. Alla fine sto cercando di ottenere una cosa tipo "[-n N] [[-r] q | -u]" però non riesco a unire "[-r] q" in un gruppo mutualmente esclusivo a "-u". Se possibile vorrei evitare subparser per mantenere l'help il più immediato possibile, senza sub help. Spero di essere stato sufficientemente chiaro. Qualche consiglio? Ciao -- Alessandro T. R: Perché leggiamo dall'alto al basso e da sinistra a destra. D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato? ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python