Dictionnaire renversé

Un dictionnaire associe des valeurs à des clés, comme par exemple {"Paris": "Tour Eiffel", "Rome": "Colisée", "Berlin": "Reichtag", "Londres": "Big Ben"} qui associe la valeur "Tour Eiffel" à la clé "Paris".

flowchart LR
  subgraph Clés
  P[Paris]
  R[Rome]
  B[Berlin] 
  L[Londres]
  end
  subgraph Valeurs
  TE(Tour Eiffel)
  BB(Big Ben)
  RE(Reichtag)
  CO(Colisée)
  end
  P --> TE
  R --> CO
  B --> RE
  L --> BB

On cherche dans cet exercice à « renverser » les dictionnaires, c'est à dire à construire un dictionnaire dans lequel les associations sont dans l'autre sens. Dans le cas précédent on aurait :

flowchart LR
  subgraph Clés
  TE[Tour Eiffel]
  BB[Big Ben]
  RE[Reichtag]
  CO[Colisée]
  end
  subgraph Valeurs
  P(Paris)
  R(Rome)
  B(Berlin)
  L(Londres)
  end
  TE --> P
  CO --> R
  RE --> B
  BB --> L

Dans certains cas, le renversement n'est pas immédiat. C'est le cas par exemple du dictionnaire {"Paris": "P", "Lyon": "L", "Nantes": "N", "Lille": "L"} puisque la valeur "L" est associée à la fois à la clé "Lyon" et à la clé "Lille".

flowchart LR
  subgraph Clés
  Ly[Lyon]
  Pa[Paris]
  Na[Nantes] 
  Li[Lille]
  end
  subgraph Valeurs
  P(P)
  L(L)
  N(N)
  end
  Ly --> L
  Pa --> P
  Na --> N
  Li --> L

On considère donc que le dictionnaire renversé associe à chaque valeur du dictionnaire initial la liste des clés associées.

Remarque

On ne demande pas à ce que ces listes soient triées dans un ordre particulier.

On triera le dictionnaire renversé dans les tests afin de gérer les différents résultats liés à des ordres différents. On garantit que toutes les clés et les valeurs utilisées sont de types comparables.

🐍 Script Python
def trier_valeurs(dico):
    for cle, valeur in dico.items():
        dico[cle] = sorted(valeur)
    return dico

Ainsi, le dictionnaire renversé de {"Paris": "Tour Eiffel", "Rome": "Colisée", "Berlin": "Reichtag", "Londres": "Big Ben"} est {'Tour Eiffel': ['Paris'], 'Colisée': ['Rome'], 'Reichtag': ['Berlin'], 'Big Ben': ['Londres']}.

Pour {"Paris": "P", "Lyon": "L", "Nantes": "N", "Lille": "L"} on peut obtenir {"P": ["Paris"], "L": ["Lyon", "Lille"], "N": ["Nantes"]}.

Vous devez écrire une fonction renverser de paramètre dico qui renvoie le dictionnaire renversé de dico.

On garantit que les valeurs du dictionnaire dico peuvent être utilisées comme clés de dictionnaires (elles sont de types simples et donc hachables).

Notez que dans le dictionnaire renversé, les valeurs sont de type construits, des listes Python en l'occurrence, non hachables et ne peuvent pas être utilisées comme clés d'un nouveau dictionnaire. L'instruction renverser(renverser(d)) ne renvoie donc pas d mais génère plutôt une erreur.

Exemples
🐍 Console Python
>>> renverser({'a': 5, 'b': 7})
{5: ['a'], 7: ['b']}
>>> renverser({'a': 5, 'b': 7, 'c': 5})
{5: ['a', 'c'], 7: ['b']}
>>> renverser({"Paris": "Tour Eiffel", "Rome": "Colisée", "Berlin": "Reichtag", "Londres": "Big Ben"})
{'Tour Eiffel': ['Paris'], 'Colisée': ['Rome'], 'Reichtag': ['Berlin'], 'Big Ben': ['Londres']}
>>> renverser({"Paris": "P", "Lyon": "L", "Nantes": "N", "Lille": "L"})
{"P": ["Paris"], "L": ["Lyon", "Lille"], "N": ["Nantes"]}
###(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:,ag)R1IiknèD}/àSé=v{msuhb.8O4;y7e[6j2odt c(w]r5_P3qplf050O0I0P0d0j0$0x0Q0R0$0d0x0x0t010P0j0#010406050x0y0w0w0d0V0G040r0N0$0y0{0N0l0Q020d0w0#0F0Q0g0I150V0!0y0I0x050p12141618100#041w1D051G0p1G1I1D100O0j0u0:0=0@0_0z0j0e0z0$1W0z0P0~050+0A0$0I1R0?0^011V1X1Z1X0P1)1+1%0P0A0N0O181(0V1E0P0z0:1b0x0#0d0l0_0M011-1T010%0-0I0l1j0I1%282a2f1/2i1+2l0w2n040a0Q0Y0V0N0#0N0x0j1e1g0)260V0V0I0R2I1w2p0l1E0p242U0P2221230O2r0_1Z0l2k2F1%1O1Q0;1.2(0j2*0l1~1P1%0#2N1E2S2U2 11291g2:2g2^0V150$0~0h2R330 322q351/37390~0M3d2a3f2S2%013k0d3a040Z3o2T103r3i0_3u3w0E3z3q333s3F0~0W3I3B3K3D3t0N383v0~0K3P3g341S3j3U3l040H3Z3C3$3E3(3W040C3I1F2}1w2.2X0O2#3s0R1~2x0(1P1E2|0I2~3e3@400)483h3.010k0~0)0%3@3-2;010T0~0Q4l3R4f0l0%0~2N0l0u0I0V0x4B4s4e4n0}040S4F3#4n0l4i0j404L3s4I0f0b3P0Q4Y4r4m364P400X4y4A4C0I3I4!4t4n0N0~0t4.3!4T0~0v0o4X4Z4_3S4h040%3U4^4#3j0~0;4-1x49570_4I0c564:4$040u3v0I0y0V5i4G2g0N4p042?5r4M5k1O4R5c3p504f4=040B4S3S4O5w0P1p1v5D2T5F4H0~0S4V4~4Z4 5e4g0~0j4k5R044/5s585l5n5p5y3s5u0~2^0P5=3S5@5w0l5{4u4%0N4)2k4+4D5K4f4I4W5*065Z6e5!5j5.5B634*4B675*5T2g4I0J684N0~5m1+5;6o5#4I0U604;4?6D6q0~6s6z6h3E591+6t6H046C6c6f4Y6p1/520I0.5b316A0~6b2 6d6U5Z6W6M046j644z6m6#5d6L016r6P5.6w5o5q6K5-5f0~6S6$6`5H5J725z5.0d0#0#2k0O6}744J7j3t6N6^5E6%040f5Y5,7c0_522N0P5p5 5*7v3L626=667p3A1w4b473^7N0p3{1w0P3}7S2Z2V1}1 2X0d1*7P3{1C4d7w012N0w0X0%0d0k0I0X0z0Z0~1o1q1s1u0Q6)491J3f1D0D1g7g1d0Q290V405p0j0V0Q1+0Q5B2I2l8e1,0q8g000,2K2K0=0Q0w0s24414r7M3s1;1Y1!1$7*7F6:4Q0N7m797m5M2H5P7m4I5W3@0p7M5I0Q850Q0V0s0R0y0#0m2N0Q0,0l2G0Q8o0R0z0d7}0Q2H0s0V0d2I8g1,8c0#8h058X5a0c0Q6 6y8X7a1M1H190j8A415/6x718X0Q0l001u0P890?898$4D0l9s8a0w9h1+0/0;0s0/2K959j6;2?7I7L9j0Q1f0:8$1,0y2*9o0N0y4A0$8h2k2Y0s1,0O2a0/8h8j0j1f8l2N9d83040n9,900:9u409y8}8m989R4D269y9%9*8q0L9Y5O8f9J4c5a9O4c8;8g0d8g0j0x5O9i4c6;6l4,0J9a0V6S9c1F9^8!879s0d0y0@9h8a8c0V8e0Q9V8i4Q8k0,8,0d4A0Rar914f8D1?1#2o6`5254712 7E5L7o6G1/5}5x7D6.7n8J5C77736{6(8V8XaB7)0i0R0j988h8B0)0u0j7ha19s6b9e2.8C1!a$8Ga_2t2k2m0~2z0r0RaM0#9s0Y0G8y7C31467*3049b25#524j7m5v4r7b3L4w04au4Da,6_a~8T8O628S0~5X6T6ga~5Mat656@a;0_5H4@a^7r4|7ua_a*55b?6`5Mahb}a~a?bC3ea.61a{8LbP3S6a7u6-5#5Maxb/01b;cib+8Kb#046Ja}7+b 6Oca6975cdb)7+525(cl6v5:bV3pc64;5v5_cic3cDc80X9Mb.cv5U04803p6+6,6Vcf7GbT7J8Hcb6IbZ9k70co76c5a_ckc17+6|cT5kc0cr4`6Rcyc!a)0~6Z6nc}c*cVd06ea_cm4(c%cocqbWcscE9lc/8M0~7ad6c77e7g0l7ic`1/bYdv6/c|dhc~7tb(d1a~7y0*7BcOb,6?4,3Z8W9j7O2U7(3`0*0,0.04.