[Python] Dove sbaglio?

Carpediem i.carpediem a tiscali.it
Ven 1 Maggio 2020 02:23:15 CEST


Il 30/04/2020 22:04, Carpediem ha scritto:
>
> Il 30/04/2020 21:24, Alessandro T. ha scritto:
>> 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
>
>
> Grazie Alessandro ho giusto scritto a Marco che resto incuriosito sul 
> perchè la mia soluzione non funzionasse
>
> praticamente dov'era l'errore? nel posizione mentre ci voleva 
> posizione +1? la voglio provare passo passo per capire.
>
> Grazie, anche perchè sono contento che la sensazione di essere vicino 
> alla soluzione era fondata.
>
> Che bella lista!!!
>
> Ciao Alessandro, come ti avevo detto, ho confrontato il tuo codice con 
> il mio e ho compreso la stupidità del mio errore.

Come hai detto tu, c'ero quasi. Ma ero concentrato a cercare dove non 
dovevo. Hai tolto il while true ma anche con quello

e la relativa istruzione break funziona bene comunque. Perfetto così. Da 
domani mi devo concentrare per assimilare il

lavoro che fa la funzione zip illustrata da Marco e poi capire l'uso che 
ne ha fatto con quel key =lambda .... Grazie ancora ad entrambi

mi avete regalato stimoli e consapevolezza.

Isidoro

> _______________________________________________
> Python mailing list
> Python a lists.python.it
> https://lists.python.it/mailman/listinfo/python


Maggiori informazioni sulla lista Python