Newsgroup: it.comp.os.linux.sys
Titolo: Python sort (semi-numerico, quasi-numerico)

hola todos.
 
devo ordinare una lista di directory di questo tipo:
all_url_text = ['22.0-0', '22.0-00', '22.0-10', ... etcetera ... '22.0-6', '22.0-7', '22.0-9']
 
Ordinarle alfabeticamente non funziona, perche' mette '22.0-10' prima di '22.0-9'
Ordinarle numericamente mi da errore perche' il nome contiene il trattino. 
 
immagino che potrei creare delle tuple, dove associo all'elemento con puntino e trattino, l'elemento senza trattino e senza puntino, e quindi ordino numericamente secondo l'elemento fatto solo di numeri. 
 
OK. Ma non vi viene in mente un metodo SEMPLICE, fattibile in una sola riga con la funziona builtin "sort"?


 
Sbagliato NG?

Niente tuple, le liste vanno benone.
google for python sort -> primo record ->
http://wiki.python.org/moin/HowTo/Sorting/
 -> Key Functions
 
Michele
 


    import re
 
    all_url_text.sort(key = lambda u : map(float, re.split('\\D+', u)))
 
Cosi' ti viene anche 0 prima di 00.
 
Leonardo
 
-- 
Were I Glenallan's Earl this tide, and were you Roland Cheyne,
My spur would be in my horse's side, the bridle upon his mane.
If they hae twenty thousand blades and we twice ten times ten,
Yet they hae but their tartan plaids, and we're mail-clad men.

 
 
 
grazie :)
per il momento la copio cosi' com'e' (visto che funziona e che vado di fretta).
Appena trovo un attimo, guardo il funzionamento. 

 
 
Quindi perche' rispondi ... dando fra l'altro suggerimenti sbagliati? :)
 
 
prova ad esibirti con il tuo suggerimento (che ovviamente non avevo bisogno di chiedere qui) e sappimi dire.

 Cosi' ti viene anche 0 prima di 00.
 
Scusate ma c'e' l'opzione -v di ls che lo fa, io metto anche
--group-directories-first all'antica. Comunque eccole:
 
[/tmp/pippo]_$: \ls -l
totale 0
-rw-r--r-- 1 yoda users 0 lug 19 15:04 22.0-0
-rw-r--r-- 1 yoda users 0 lug 19 15:03 22.0-00
-rw-r--r-- 1 yoda users 0 lug 19 15:04 22.0-10
-rw-r--r-- 1 yoda users 0 lug 19 15:04 22.0-6
 
[/tmp/pippo]_$: \ls -l -v
totale 0
-rw-r--r-- 1 yoda users 0 lug 19 15:04 22.0-0
-rw-r--r-- 1 yoda users 0 lug 19 15:03 22.0-00
-rw-r--r-- 1 yoda users 0 lug 19 15:04 22.0-6
-rw-r--r-- 1 yoda users 0 lug 19 15:04 22.0-10
 
-- 
Tanti saluti
 


Come osi!
Un suggerimento del Maestro si prende così com'è, come atto di fede.
Se provi a capirne il funzionamento il Suo strumento smetterà di funzionare 
(anzi, ti formatterà direttamente l'hd).
 
 
-- 
Roberto Tagliaferri-Linux user #30785 <-> r.tagliaferri@(forse)
tosnet.it
 
www.robyt.eu
 
 


 
cosa significa, in Italiano, questa frase?
 
guarda che con la funzione sort di python lo puoi fare tranquillamente, 
in una sola riga, in modo SEMPLICE, prendendo spunto dalla pagina che ti 
ho consigliato.
 
magari fa caldo ed è venerdì pomeriggio?
 
 

 Scusate ma c'e' l'opzione -v di ls che lo fa, io metto anche
 
Ritratto tutto, se possibile anche la figuraccia. Era l'elenco da
ordinare, l'ho capito adesso cercando di decifrare Leonardo.
 
-- 
Tanti saluti
 

 magari fa caldo ed ï¿½ venerdï¿½ pomeriggio?
 
dai... facci vedere ... facci capire che non era il caso di ricorrere alla regular expression di Leonardo...
mostraci il codice, in base agli elementi che io ho fornito e vediamo come funziona con il solo sort. Sono curioso. 
 
p.s.: non continuare a scrivere che si puo' fare perche' ti avviso che non basta: devi farlo.


figurati... in ogni caso, non lo avevo detto, ma si tratta di una pagina web... quindi niente "ls", o (visto che siamo su python) niente os.listidr("blabla")


LOL .... in effetti quel "float, re.split('\\D+', u)" mi sembra un abracadabra :)
Dici che e' meglio astenersi dal capire il funzionamento?

 Sono curioso.
 
Adamo, leggi il labiale. Sei OT. Che poi ti abbiano risposto (piu` per 
cortesia che per dovere) e` un altro discorso
 
Enrico


Non mi hanno risposto. Mi sono state scritte minchiate, rimarcando presunti e non veri errori da parte mia.
Bianchi, mi scuso per aver omesso [OT] nel subject, o per non aver scritto in un gruppo piu' appropriato, ma per il resto se mi raccontano minchiate, di minchiate si tratta.


 
Mamma mia... Da dove nasce tutta questa cattiveria mista a saggezza?
E chi sei? Il Marchionne de no' altri?
 
Volevo mettermi li a pensarci quei tre secondi e dirti qualche ipotesi, 
ma mi č passata la voglia.
 
P.s. Nemmeno continuo intanto č fiato (tastiera) sprecato.

 P.s. Nemmeno continuo intanto è fiato (tastiera) sprecato.
 
ah già... ecco perché non puoi, non perché non si possa fare. 
 
p.s.: sicuro che sono io il saputello e non qualcuno che ha iniziato a pontificare che era sufficiente fare così e colì? ;)

Dici che e' meglio astenersi dal capire il funzionamento?
 
Ma andate un po' tutt'e due a ciapa' i ratt, dilinGuenti :-D
 
	all_url_text.sort(key = lambda u : map(float, re.split('\\D+', u)))
 
tradotto dal Serpentese:
 
	all_url_text.sort
 
		ordina all_url_text
 
	(key = lambda
 
		usando come chiave una lambda che,
 
	u
		detto "u" ogni elemento della lista,
 
	:
		ritorni
 
	map(
		una lista o tupla ottenuta applicando la funzione
 
	float
		float
 
	,
		alla lista
 
	re.split(
 
		ottenuta splittando, con una regexp che usa come separatore 
 
	'\\D+'
 
		una sequenza di uno o piu' non-numeri, come "-", "." ecc.
 
	,
		,
 
	u
		l'elemento u
 
 
Quindi
 
	['22.0-0', '22.0-00', '22.0-10', ... etcetera ... '22.0-6', '22.0-7',
	 '22.0-9']
 
viene trattato come se fosse
 
	[[22, 0, 0], [22, 0, 0], [22, 0, 10], ... [22, 0, 6], [22, 0, 7],
	 [22, 0, 9]]
 
e cio' da' il risultato voluto, questo perche' "sort" effettua un ordinamento
naturale diretto quando trova una lista, ossia [22, 0, 0] < [22, 0, 1].
 
In alternativa in python c'e' l'istruzione universale
 
	import chuck norris
 
che fa si' che il programma dia la risposta esatta in ogni caso. O per essere
piu' precisi: QUALUNQUE risposta il programma dia, e' bene se la prendete per
buona.


it.comp.lang.python
 
...
 
<EPIC FACEPALM>
 
...
 
Ora tu non ci crederai, ma benche' fosse lapalissiano che quel gruppo DOVESSE
esistere (suppongo sia la regola #36)... non mi era mai venuto in mente.
 
Be'. Nell'ordine, ora ringrazio te; sottoscrivo il gruppo; e poi mi cerco uno
bravo perche' i fatti provano che mi s'e' liquefatto l'eventuale cervello :-(


 figurati... in ogni caso, non lo avevo detto, ma si tratta di una pagina web... quindi niente "ls", o (visto che siamo su python) niente os.listidr("blabla")
 
Dato che prevenire e` sempre meglio che curare,
magari la prossima volta cerchi di fare in modo,
per quanto possibile, di avere i numeri "padded".
Cioe`, invece che 0 1 2 ... 10 11 ..., meglio
sarebbe 00 01 02 ... 10 11.
 
bye,
 
-- 
 
piergiorgio

 
 
p.s.: non ho capito una cosa... "python" viene spesso definito come linguaggio di scriptint adatto per principianti. A quel che vedo però a volte ci si fanno cose non proprio da principianti. 
A parte i vari server, N volte più lenti delle loro controparti in C, ci sono lavoretti in giro di un certo livello. 


tranquillo che se avessi avuto accesso al web server (dei nostri sviluppatori) avrei rinominato le directory senza dire niente a nessuno :)

A parte i vari server, N volte più lenti delle loro controparti in C,
 
Be', sai cosa: non credevo che avrei mai detto una roba cosi', ma... la
velocita' non e' tutto.
 
Per altro, confesso che io ho iniziato a ciappinare col Python piu' che
altro perche' un linguaggio BASATO sulla indentazione aveva su di me un
fascino irresistibile :-)


 sono lavoretti in giro di un certo livello.
 
Spesso non si tiene conto di un fattore importante durante la stesura di un 
progetto: la velocita` di implementazione e di manutenzione. Con Python 
questi due dettagli, soprattutto in ambito web, sono di fatto abbassati di 
brutto, proprio grazie alla sua semplicita` e al suo pragmatismo (import 
this per maggiori informazioni). Se poi serve la velocita`, basta 
ottimizzare quelle parti critiche riscrivendole in C o usare un framweork 
asincrono (twisted va per la maggiore). Ovviamente anche Python ha i suoi 
bei difetti, ma questo e` un altro discorso che si esime da questo gruppo 
(sottolineo: c'e` it.commp.lang.python o la mailing list italiana se volete 
approfondire)
 
Enrico

 fascino irresistibile :-)
 
ROTFL.

Addi' 23 lug 2013, whiplash scrive:

Scusa ma tanto siamo d'estate e con gran caldo, ma me la spieghi? cosa
vuol dire "BASATO" tutto maiuscolo "sulla indentazione"? indentare nel
senso dei programmi lo si puo fare anche in C, indentare invece come?
 
-- 
Tanti saluti
 

 vuol dire "BASATO" tutto maiuscolo "sulla indentazione"?
 
In C:
 
if (variabile == 0) {
printf("testo"); // mi sembra, evito spesso e volentieri il C
}
 
In Python:
 
if variabile == 0:
    print "testo" # in python 3 si usa print("testo")
 
Enrico


in python gli spazi o i tab iniziali sono importanti al contrario del C
questo è il motivo principale per cui a me non piace
 

vuol dire "BASATO" tutto maiuscolo "sulla indentazione"?
 
Che in Python i livelli di "annidamento" del codice sono codificati mediante
l'indentazione:
 
	for ...
		if condizione:
			se-vero
		else:
			se-falso-1
			se-falso-2
		codice eseguito comunque
	codice fuori dal ciclo for
 
E whiplash probabilmente ha trovato divertente che lo dicessi io, perche' e'
noto che io ho il pallino della formattazione dei testi.


 fascino irresistibile :-)
 
Immagino che tu, come "real programmer", usi
ancora il FORTRAN... :-)
 
bye,
 
-- 
 
piergiorgio


Be', no. C, PHP, Java, Python, e C.


Addi' 23 lug 2013, enoquick scrive:

Idem, addirittura io il poco che faccio lo faccio col C e senza
indentare nulla lo capisco molto di piu'. L'importante sono i commenti.
 
Grazie della risposta, anche a Henryx che pero' non avevo capito.
 
-- 
Tanti saluti
 

 noto che io ho il pallino della formattazione dei testi.
 
Scusa allora due curiosita':
1) Davvero preferisci il Python al C per quest'inezia (tra l'altro che,
secondo me, e' solo una terribile e fastidiosissima incombenza)? stento
a crederci!
2) Perche' allora nei NG non rispetti l'"a capo" alla 72-ma colonna, che
(almeno un tempo) era praticamente d'obbligo?
 
Commentino: Va be' che tanto adesso, con google-G/2-windows-outluc, a
capo e' come a messa: Non ci va piu' nessuno! -- Maledizione!
 
-- 
Tanti saluti
 

 Be', no. C, PHP, Java, Python, e C.
 
Scrivevo FORTRAN, perche` mi pare di ricordare
anche quel linguaggio richiedesse una certa
attenzione con l'indentazione...
 
E poi perche`: 
http://www.webcitation.org/659yh1oSh
 
 
bye,
 
-- 
 
piergiorgio

(almeno un tempo) era praticamente d'obbligo?
 
Oh, io ho il limite di caratteri a 78. Ma siccome Agent non ha un ruler,
di solito vado ad occhio, e vado a capo in un punto a caso fra la 60ma e
la 78ma riga. Quasi quasi, uno di questi giorni faro' una statistica per
vedere come va la distribuzione. Stavolta (ma giusto perche' l'hai detto
tu) ho provato a contare 72 caratteri. Non diventera' un'abitudine :-)


 a crederci!
 
Punti di vista. Per me ad esempio il C e il C++ sono assolutamente evitabili 
perche` richiedono ancora un forte uso  dei puntatori che, linguaggi come 
Python, non necessitano a causa del loro livello di astrazione, riducendo 
pertanto i tempi di sviluppo e di manutenzione del codice
 
Enrico


 
Usando un buon editor adatto allo sviluppo l' indentazione non è un problema



Già sentita.
 
E' il vorrei ma non posso di chi legge e rilegge i manuali ma non capisce 
cosa sia e come funzioni un puntatore.
 

 cosa sia e come funzioni un puntatore.
 
Analogamente a come questa sembra la frase di chi rifiuta a priori uno 
strumento che può essere comodo solo perché nuovo|diverso|sconosciuto.
 
La scala di valori, cosa è meglio e cosa è peggio, cambia in base al 
contesto. Ogni lavoro ha uno strumento che è più o meno adatto in base 
alla scala di valori.
 
Lo dico senza spirito polemico, è un ambito in cui mi sembra inutile 
tirare delle linee di confine e dire "tu stai di là, io sto di qua".

 attenzione con l'indentazione...
 
solo per i primi 8 caratteri (e la riga doveva essere al max 80
caratteri), e cmq la cosa e' stata abolita (anche se la
retrocompatibilita' e' mantenuta) con il Fortran 90 (o il 95 non
ricordo).
 
Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?

 }
 
o anche:
 
if(!variabile) printf("testo");
 
Decisametne l'indent in C e' opzionale, oppure usato per
scopi...divertenti :)
 
http://www.ioccc.org
 



Non hai colto per niente quello che volevo dire e soprattutto non ho 
rifiutato a priori alcuno strumento.
 
E se noti, non ho mai nominato il python per cui non ho mai mosso 
critiche a strumenti sconosciuti o altro.
 
Argomentare che i puntatori in C ti fanno perdere tempo denota ignoranza 
sia se conosci il C (perchè non è vero) sia se non lo conosci (perchè 
ignorando è bene non esprimersi).
 
Per il resto, concordo col principio che "context matters".

 vero che il Python m'ha incuriosito, inizialmente, per quello.
 
A Leona`, eh! Capisco i problemi di indentazione :-),
ma il nome dammelo corretto...
 
bye.
 
-- 
 
piergiorgio

 indentare nulla lo capisco molto di piu'. L'importante sono i commenti.
 
tu non hai mai dovuto condividere lo sviluppo del codice con qualcun altro, 
vero?
 
-- 
ZeD


Se lavori solo per te stesso puoi fare come vuoi
Se fai progetti a livello professionale e lavori e collabori in gruppi 
di lavoro, una regola comune su come scrivere il codice sarebbe meglio 
darsela
 
 
 

Capisco i problemi di indentazione :-)
 
Oh no, in quel caso avrei detto "Rimane vero che...". E' proprio che mi
ero bevuto il cervello :-(((


Addi' 24 lug 2013, Vito De Tullio scrive:

Certo che no! sono appena un dilettante occasionale, appena un po' piu'
avanti dell'"hello world".
 
-- 
Tanti saluti
 

 tu) ho provato a contare 72 caratteri. Non diventera' un'abitudine :-)
 
Gia', e hai pure giustificato e senza neppure un doppio spazio in tutto
il reply, se non me n'e' sfuggito qualcuno. Una bella fortuna!
Pensa che io non giustifico proprio perche' non li sopporto, certe volte
si arriva anche a cinque o sei spazi pur di giustificare, e "lineetta a
capo" nei NG non si puo', se no si risolverebbe molto.
 
-- 
Tanti saluti
 

 il reply, se non me n'e' sfuggito qualcuno. Una bella fortuna!
 
Non e` fortuna... :-)
 
Qualcuno ha coniato il verbo "sernificare", proprio
per descrivere il tipo di giustificazione che Leonardo
abitualmente e costantemente fa.
 
Controlla tutti i suoi post... :-)
 
bye,
 
-- 
 
piergiorgio

Addi' 24 lug 2013, Piergiorgio Sartor scrive:

Cavoli, e' impressionante! Comunque e' uno splendore!
Allora capisco: era una battuta in questo senso l'attrazione di Leonardo
per il Python!
 
Puoi dirmi qual e' il programma per sernificare? Ma se c'e' anche per
Linux, perche' Leonardo usa Forte' Agent, quindi e' con Win7-8 o al piu'
con XP.
Dev'essere un programma con l'a capo variabile, per tentativi tra 60 e
78 colonne come m'ha detto, poi magari se non prende cambia una o due
parole.
 
-- 
Tanti saluti
 

 ignorando è bene non esprimersi).
 
Devo fare alcune ammissioni:
 
 - Ho cannato completamente esempio. Se andiamo a rileggere la discussione
   la comparazione veniva fatta piu` a livello di semantica del linguaggio
   che sul suo funzionamento diretto. A mia discolpa posso solo dire che era
   tardi quando ho risposto e avevo sonno...
 - Ammetto di non conoscere C se non a livello veramente basilare. Il mio
   studio si e` fermato proprio quando vidi che per fare molte cose dovevi
   utilizzare per forza la logica dei puntatori. Ora, probabilmente quando
   vidi questa roba ero troppo giovane e immaturo, fatto sta che che il
   "trauma" mi ha fatto ricordare quel concetto e fatto intraprendere altre
   strade. Per inciso, come descritto qua, Python fa un uso pesante dei
   puntatori, ma in modo decisamente piu` implicito:
 
http://python.net/crew/mwh/hacks/objectthink.html
 
 
Detto questo, a livello di tempistiche di sviluppo Python e` indubbiamente 
piu` veloce di C, per il fatto che il C e` si un linguaggio ad alto livello, 
ma il livello di astrazione di Python e` piu` alto. Questo ha permesso di 
rendere piu` snello l'intero processo di sviluppo di un applicativo, dato 
che non si rende necessario tenere a mente certi dettagli implementativi. 
Inoltre la filosofia di Python e` di essere il piu` pragmatico possibile, 
evitando di reinventare la ruota (less is more, per maggiori informazioni 
basta un import this nella shell di Python)
 
Enrico

 piu` veloce di C
 
Dimenticavo un pezzo importante: e` ovvio che tutto questo dipende 
decisamente dal progetto, perche` se ho ad esempio dei requisiti decisamente 
stringenti a livello di risorse, non me ne faccio molto del fatto che posso 
scrivere meno codice e lo posso scrivere piu` velocemente (ovvero, ogni 
linguaggio ha il suo contesto e in quello cerca di eccellere)
 
Enrico

capo" nei NG non si puo'
 
Infatti, neanch'io li sopporto. E dovresti vedere le paranoie che mi faccio
quando scrivo del codice: l'ordine dei parametri, il nome delle funzioni, e
una quantita' di altre cose (incapsulamento, no side effects, ...).
 
Ora mi sono letto "Clean Code", e ho stabilito che posso migliorare ancora.
 
Contrariamente a quanto si potrebbe pensare (e a quanto pensavo io stesso),
e dopo un po' che uno s'e' abituato, scrivere codice fanaticamente ordinato
non aumenta i tempi di sviluppo, anzi li riduce marcatamente (per non dire,
poi, dei tempi del DEBUG! E la documentazione!). E' ancora poco che sono su
questi nuovi livelli di fanatismo, e non ho statistiche: pero' ho una forte
impressione che il tempo di sviluppo diventi anche piu' *prevedibile* (devo
dire pero' che io sono anche un fan del RDUF-and-BDUF, e cio' aiuta molto).


 parole.
 
Che io sappia il "programma" e` Leonardo Serni... :-)
Devi comunque chiedere a lui, per i dettagli ed
eventuali chiarimenti.
 
bye,
 
-- 
 
piergiorgio

 noto che io ho il pallino della formattazione dei testi.
 
credo che tu fossi uno tra quelli che usava 'par' all'interno di 'vi' per 
inviare messaggi su usenet tramite 'tin' :) 
ho nominato tre tecnologie del trapassato remoto: 
- qualcuno usa ancora Tin??
- qualcuno usa ancora vi invece di vim??
- qualcuno si ricorda ancora di par??
 
-- 
Massimiliano

 inviare messaggi su usenet tramite 'tin' :)
 
Che io sappia, Serni non ha mai usato par
 
Enrico


bei tempi comunque... la gente si configurava INN in casa per ricevere i 
feed da un paio di newsgroup :) 

- qualcuno si ricorda ancora di par??
 
Mai usato :-)



Facebook: Massimo Bacilieri

 Dai... si usava leafnode. Anzi quello lo uso ancora :-)
 
leafnode era considerato troppo da niubbo :) 
Il massimo che poteva essere ammesso era INN + suck (per limitare il feed 
ad un paio di gruppi con suck)