Forum >> Programmazione Python >> Scripting >> Riordinare una lista mediante parametri stabiliti

Pagina: 1 2 Avanti

Salve a tutti amici, mi sto scervellando per far eseguire questa operazione su una lista al mio programma :question:



in poche parole vorrei che data la lista:




lista = ['antonio', 'giuseppe', 'francesco']  





gli elementi passati alla funzione sorted() siano ordinati in base a delle regole stabilite da me, ad esempio vorrei che richiamando la funzione sorted(lista) la lista venga riordinata in questo modo:




['giuseppe' , 'francesco' , 'antonio']





quindi un ordine alfabetico stabilito da me. :fingers-crossed:




Grazie mille e buona serata a tutti :py:


--- Ultima modifica di dandi98 in data 2019-02-05 23:10:17 ---
se sei in grado di stabilire le regole di questo tuo nuovo fantomatico ordine alfabetico ed esprimerle in una funzione... boh, puoi passare questa funzione come argomento "key" della funzione sort. Per esempio,


>>> a = ['mela', 'banana', 'mandarino', 'ciliegia', 'arancia']
>>> a.sort(key=len) # ordina per len(i), cioè per lunghezza della parola
>>> a
['mela', 'banana', 'arancia', 'ciliegia', 'mandarino']

posso fare una correlazione a dizionario tipo
{1:'giuseppe', 2:'antonio',3:'francesco'}

posso fare una correlazione a dizionario tipo
{1:'giuseppe', 2:'antonio',3:'francesco'}


beh a questo punto cosa cambia se stampi il dizionario o se stampi una lista

essendo che in entrambi i casi se fai un print output è identica a come tu li hai inseriti sia nella dict che nella list




dovresti spiegare prima bene quale sia il tuo intento o lo scopo che vuoi raggiungere che a dir il vero non è ben chiaro

si è capito che vuoi output di questa lista, ordinata in un certo modo ma i criteri di ordine quali sono? è una lista fissa?




ci possono essere tanti metodi diversi, come già accennati il semplice print ti stampa nell'ordine di come sono stati inseriti

poi tramite sort in ordine crescente o decrescente, ma si potrebbe pensare a tanti modi per estrapolare i dati da una lista

prendere solo parole con alcune iniziali, oppure prima una determinate lettere e poi le altre o che contengono alcune lettere

o ancora sia con i dict che con le liste ritornare le parole con gl'indici prima pari e poi dispari dovrebbero essere tutte fattibili




ovviamente maggiori criteri è più complesso risulta realizzare il codice, pensa prima bene a ciò che vuoi fare se vale la pena?

ciao , in effetti quello che vorrei ottenere è proprio dare una priorità di lista alle stringhe che iniziano con una determinata parola quindi ordinare bella lista prima tutte le stringhe che cominciano con 'gi' poi tutte quelle che cominciano con 'fa' ecc :)
Continua a non essere chiaro, comunque per tagliare corto immaginiano che tu abbia bisogno di questa regola:


- prima tutte le parole che iniziano per "fa" (e tra di loro, in ordine alfabetico);
- poi tutte quelle che iniziano per "ba" (e tra di loro, in ordine alfabetico);
- poi tutte le altre, in ordine alfabetico.


Se fosse una cosa del genere, come ti dicevo puoi banalmente scrivere una funzione che assegna un indice di "priorità" più basso per le parole in "fa" e "ba", e più alto per le altre. Poi puoi ordinare secondo questo indice.


>>> def priority_index(s):
        if s.startswith('fa'): return 1 # prima queste
        if s.startswith('ba'): return 2 # poi queste
        return 1000  # e poi tutte le altre

>>> lst = ['fragola', 'mela', 'banana', 'fagiolo', 'pera', 'fantasia', 'barattolo']
>>> lst.sort()  # prima in ordine alfabetico
>>> lst.sort(key=priority_index) # e poi per priorita'
>>> lst
['fagiolo', 'fantasia', 'banana', 'barattolo', 'fragola', 'mela', 'pera']
E sono sicuro che puoi fare qualche diavoleria con operator.itemgetter o qualcosa di astruso del genere per unificare le due sort... ma dovrei guardare, su due piedi non mi viene in mente.



--- Ultima modifica di RicPol in data 2019-02-06 13:36:24 ---
Ciao, alla fine ho risolto realizzando io una funzione che facesse al caso mio, credevo esistesse un opzione ad hoc in
sorted()
def elenco_forzato(path):
    modd = []

    def cicla(name):
        for file in os.listdir(path):
            if file.startswith(name):
                modd.append(file)

    
    cicla('giu')
    cicla('fra')
    cicla('ant')

    return modd
grazie per l'aiuto e buona serata :)
Ciao, alla fine ho risolto realizzando io una funzione che facesse al caso mio, credevo esistesse un opzione ad hoc in sorted()
beh ma guarda secondo me l'esempio di Ric usa già una funzione abbastanza specifica,

ovviamente è difficile poter trovare un modo personale di fare le cose fatto da altri

in questo caso le cose te li devi costruire, un'alternativa dello "startswith"

usato da Ric, potrebbe essere realizzato tramite dei for tipo questi:


l = ['giuseppe', 'antonio', 'francesco', 'giuseppina']
f = ['gi', 'fr', 'ma']

for j in f:
	for i in l:
		if i[:2] in j: print(i)

for i in l:
	if i[:2] not in f: print(i)
sono quasi sicuro che l'ultimo for potrebbe essere accorpato al primo

anzi forse si potrebbe racchiudere tutto in una riga usando il lambda?

(ma per questo alzo le mani che il lambda per me è tutto da scoprire)

> credevo esistesse un opzione ad hoc

Ma CERTO che esiste una opzione ad hoc, è il parametro "key" come ti ho spiegato e mostrato. A volte (ma solo a volte, eh) ho l'impressione che quello che scrivo non sia... come dire... letto.


E la tua soluzione NON è giusta, o almeno NON corrisponde a quello che dicevi di volere: primo perché lascia fuori tutti gli elementi che non prende, quindi NON è un ordinamento (se vuoi è un filtro) e tu parlavi di ordinamento; secondo perché, anche a voler prendere solo quelli voluti, NON li ordina nemmeno tra loro. E poi, insomma: ciclare tre volte su una lista solo per un compito del genere mi sembra un po' eccessivo. Almeno cicla una volta sola, no?

@pypy: No, neanche la tua "soluzione" è giusta, e sicuramente non è un'alternativa alla mia. Primo perché il test "if i\[:2] in j" è sbagliato, dovrebbe essere "if i\[:2] == j" (e a proposito, sempre complimenti per i nomi delle variabili, eh). Secondo perché... ma insomma, un coso che sputa fuori dei "print" non può essere la soluzione di niente. Terzo perché comunque raggruppa la parole correttamente (e non ne lascia fuori nessuna, almeno questo) ma non ordina ulteriormente all'interno dei gruppi. Quarto perché anche tu cicli quattro volte (quattro volte!) su quella benedetta lista... Quindi ok, almeno è un ordinamento (cioè, lo *sarebbe* se producesse un oggetto ordinato anziché sputare dei print), ed è un ordinamento stabile, che è già molto meglio della "soluzione" dell'OP... ma per il resto mi sembra... mah.



Pagina: 1 2 Avanti



Esegui il login per scrivere una risposta.