Dictionnaire de valeurs extrêmes

Écrire une fonction extremes qui prend en paramètre un tableau valeurs de nombres a priori non triés, et qui renvoie la plus petite ainsi que la plus grande valeur du tableau sous la forme d'un dictionnaire à deux clés 'min' et 'max'.

Si le tableau est vide, les extrêmes n'existent pas ; on utilisera alors None pour chacun.

Contrainte

On n'utilisera pas les fonctions min, max, sort, sorted fournies par le langage.

Exemples
>>> valeurs = [0, 1, 4, 2, -2, 9, 3, 1, 7, 1]
>>> resultat = extremes(valeurs)
>>> resultat
{'min': -2, 'max': 9}
>>> valeurs = [37, 37]
>>> resultat = extremes(valeurs)
>>> resultat
{'min': 37, 'max': 37}
>>> valeurs = []
>>> resultat = extremes(valeurs)
>>> resultat
{'min': None, 'max': None}
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013[,sna{cPmy7)f]4wu29l3 (6}ev08;xbokp/ihSg1t:5=Ndr050V0A0Q0f0L0u0d0w0h0u0f0d0d0T010Q0L0J010406050d0r0j0j0f0W0k040N0H0u0r0;0H0e050K0{0}0 110_0J041a1h051k0K1k1m1h0_0V0L0B0)0+0-0/0M0L0O0M0u1A0M0Q0@050!0G0u0A1v0,0.011z1B1D1B0Q1J1L1H0Q0G0H0V111I0W1i0Q0M0)140d0J0f0e0/0s011N1x010n0$0A0e0f0j0A1H1/1;1_1P1|1L1 210@0a0w0i0W0H0J0H0d0L170e0w0Y1-0W0W0A0h2m1a240e1i0K1+2z0Q1)1(1*0V260/1D0e1~2j1H1s1u0*1O2J0L2L0e1#1t1H0J2s1i2x2z2%0`1:2n2R1`2W0W0~0u0@0w0P2w2+0^2*252-1P2/2;2?0s2_1;2{2x2I01300f2=040w0v342y0_372~0/3a3c0w0p3g362+383m2?0S3q3i3s3k390H2:3b2?0y3x2|2,1w2 3C313d0l3H3j3K3l3M3E3d0D3Q3z3S3B3D3n0t3Y2}3!3u040P0C3)3J2S3#3N0P2^1b2`3y3*3=3,0P333`351j2#1a2P2C0V2G380h1#221i471l452)422y054c0Y2$3Z3=0I0@0Y0n3q3I380q2?4w3R3~0n0@0A0F2D0A210d4B4q1`0?040x4M3}2.0@0B3b0A0r0W4L4k4p4T1P4P0m0R3x0w4.0w4x3A4s040L4v4$4:4C4U044W1L4Z4#2%4{4N1P0H0@0T0T3q544(0/4P0b0o4,4$064/5l5c3;1`4?2s0Q4Z194`4;3!4P0g4S5o1P0d1@04010j2U015A384P5i535w4r0h0@0U180A5K3A4P0c5b5P1`5D0@5G0f0F5J4$5#4)0@5N2`5n380I5R045T2L5W5x0@0z4-4/5.0/4?0A0%5V5-4|5/045;355k5m4.63390@5H0e0L5!6a0/57045a5v6p6j4~4X515}3=5f6A1`5H0@3/69555e0@0o616g6i0e6k5*6n6u6J016r6t5O6v6Q6x504!6D6b0b6)0/6F046H2)6v4P6M5j6g6h6v4?0n3C6o6V6#0F6 5d6W4z4@5u6Z704V6y6(6I745M6N6_6`6V4?4^735B3l0@726U746r020u0Q0E7n3t6k2U6T6;6V7g6^7i6_6P7B6m7z3A6X7N3+7q7h7i6i7l4_7974717Q3=7u0O7x7#4}0~0F7D2`6i7G2%6f7I5m7K047,7.355?7O587*2 7S7H6O6{0@5r5t816K045z7e7o015%5F6l5,7E7f5:8a6w6l7|4l6=0@5Z7s8f8h5)5+6,017;5=7_7{8B4P605j1a4n0A2z2!8N461t482C2E2A1!1$2C0f1K8Q0K470_8%0Z0#0%04.