[Python] Dove sbaglio?

Marco Beri marcoberi a gmail.com
Gio 30 Apr 2020 19:53:59 CEST


On Thu, Apr 30, 2020 at 7:45 PM Carpediem <i.carpediem a tiscali.it> wrote:

> Il 30/04/2020 18:54, Marco Beri ha scritto:
>
> On Thu, Apr 30, 2020 at 6:18 PM Carpediem <i.carpediem a tiscali.it> wrote:
>
>> Grazie Alessandro. Mi hai fatto notare l'assenza dell'istruzione break e
>> ora che l'ho inserita, il programma termina la sua esecuzione.
>>
>> Purtroppo, non mi restituisce ciò che mi aspetto e continuo a non capire
>> perchè. L'ordinamento che cerco, è in
>>
>> relazione con l'indice dei numeri della lista di riferimento e
>> utilizzare il metodo sorted() per quel che ho visto, o compreso, non mi
>> è di aiuto.
>>
>> Partendo da questo:
>>
>> [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]
>>
>> [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]
>>
>> volevo ottenere questo:
>>
>> [10, 36, 12, 32, .............]
>>
>> [55, 55, 53, 53, 52, ......]
>>
>
> Se guardi la documentazione di cosa fanno zip e sorted (che ha un
> parametro reversed) vedrai che quello che vuoi fare è ottenibile con poche
> istruzioni:
>
> >>> riepilogo_numeri_singoli = [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_numeri_singoli = [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]
> >>>
> >>> ritardo_numeri_singoli_ordine_decrescente , numeri_singoli_in_ordine =
> zip(*sorted(zip(ritardo_numeri_singoli, riepilogo_numeri_singoli),
> 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
> (36, 10, 32, 12, 14, 26, 13, 11, 30, 21, 17, 24, 27, 15, 3, 23, 33, 8, 18,
> 22, 35, 9, 0, 29, 4, 2, 25, 16, 20, 5, 34, 19, 28, 31, 6, 7, 1)
> >>>
>
>
> Ciao.
> Marco.
>
>
> Grazie per il tuo tempo Marco. Scoprire che tutto il casino che ho scritto
> si può riassumere in una sola istruzione quasi mi demoralizza. Tuttavia, il
> risultato che ottengo con ciò che mi
>
> hai suggerito, non è ciò che voglio. il primo numero della lista
> ritardo_numeri_singoli_in_ordine_decrescente è il numero 55 che nella lista
> ritardo_numeri_singoli aveva indice 10 e in corrispondenza
>
> dell'indice 10 della lista riepilogo_numeri_singoli c'è il numero 10 che
> dovrebbe essere il primo numero presente nella lista numeri_singoli_in
> ordine. Il secondo 55 aveva indice 36 e quindi il numero
>
> corrispondente con tale indice nella lista riepilogo_numeri_singoli (il
> 36) dovrebbe essere il secondo numero presente nella nuova lista e così
> via. Quindi [10, 36, 12, 32 ....]
>
> La tua soluzione mi rende invece un risultato diverso. Molto probabilmente
> l'intenzione di ciò che voglio ottenere è stata da me espressa poco
> chiaramente.
>
> L'istruzione sort con reverse = True l'avevo usata anche io per l'ordine
> decrescente ma l'Istruzione zip è invece a me totalmente sconosciuta.
> Cercherò di capirci qualcosa.
>
> E' comunque utilizzabile per ciò che mi serve? In caso affermativo vedere
> l'istruzione che rende il risultato corretto mi faciliterebbe molto a
> comprendere il suo funzionamento.
>
> Se ti fosse possibile, sono certo ne troverei giovamento.
>

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.
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20200430/6a2ddc4d/attachment.html>


Maggiori informazioni sulla lista Python