Ordinare lista di tuple

j
jbox65 (530 points)
3 7 10
asked Jan 7, 2020 in Programmare in Python by jbox65 (530 points)
Ho una lista composta da tuple, e voglio ordinarla in modo tale che il secondo elemento della tupla sia vicino all'elemento corrispondente nella prima posizione di un'altra tupla nella lista, esempio:

[(0,1),(4,0),(1,3),(3,2)]  diventerà [(4,0),(0,1),(1,3),(3,2)],

esiste un modo per risolvere questo problema senza dover usare index?
510 views

2 Answers

Tommaso Sgroi (12990 points)
6 11 91
answered Jan 7, 2020 by Tommaso Sgroi (12,990 points)
edited Jan 7, 2020 by Tommaso Sgroi

Potresti creare una copia della lista (lista2) dalla tua lista originale (lista1) e mettere il suo primo elemento in cui compare 0 in seconda posizione in una variabile(var1), togli il primo elemento da lista2 (così da evitare di contare anche var1), poi in un while che ha come condizione che la tua lista2 abbia len>0, iteri al contrario su lista2 e confronti il secondo elemento della tupla(var2) con var1; Se coincidono allora in una terza lista(listafinale) appendi var1 e poi var2, ed elimini var1 dalla lista2 e il tuo var1 diventa var2. 

Alla fine copi in lista1 in listafinale.

Questo è il primo modo che mi è venuto in mente senza l'utilizzo di index, probabilmente si può ottimizzare.

Dovrebbe andare, ovviamente ci devono essere anche controlli aggiuntivi ed eventuali passi intermedi. Fammi sapere se qualcosa non è chiaro.

j
jbox65 (530 points)
3 7 10
commented Jan 7, 2020 by jbox65 (530 points)
Alla fine ho risolto usando un dizionario, visto che non ci sono ripetizioni tra primi elementi, li uso come chiave e mi risolvo il problema della lentezza dell'index, però il metodo tuo mi sembra altrettanto valido.
Tommaso Sgroi (12990 points)
6 11 91
commented Jan 7, 2020 by Tommaso Sgroi (12,990 points)
Interessante, però poi dal dizionario alla lista come lo risolvi? Tramite un ulteriore ciclo?
j
jbox65 (530 points)
3 7 10
commented Jan 8, 2020 by jbox65 (530 points)
praticamente creo un dizionario key=valore1 e contenuto=valore2 (valori della tupla), creo una lista vuota, con un ciclo for aggiungo man mano alla lista vuota la tupla composta da valore1=primo elemento della tupla che metto come prima della lista, valore2=contenuto della chiave corrispondente al primo valore di questa tupla del dizionario che mi sono creato. Al prossimo step del ciclo (che dura la lunghezza della lista di tuple) come valore1 userò il valore2 della precedente tupla, e come valore2 il valore dato dal dizionario, e così via
Tommaso Sgroi (12990 points)
6 11 91
commented Jan 8, 2020 by Tommaso Sgroi (12,990 points)
Carino pure questo haha
V
Vittorio (940 points)
6 8 16
answered Jan 8, 2020 by Vittorio (940 points)
Hai provato ad usare la funzione sorted()
Tommaso Sgroi (12990 points)
6 11 91
commented Jan 8, 2020 by Tommaso Sgroi (12,990 points)
Il problema sembra un po' troppo complicato per utilizzare sorted, anche con una lambda function. Perché il criterio di ordinamento è troppo complicato per essere risolto in questo modo.

A questo punto la cosa più logica da fare è strutturarsi la propria funzione di ordinamento, sfruttando i pointer alla lista per modificarla, oppure ritornando il valore corretto di essa.