[Python] Dove sbaglio?

Alessandro T. tagliare3 a yahoo.it
Gio 30 Apr 2020 21:24:28 CEST


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

-- 
Alessandro T.

R: Perché leggiamo dall'alto al basso e da sinistra a destra.
D: Perché dovrei iniziare la risposta all'e-mail dopo il testo citato?



Maggiori informazioni sulla lista Python