Aimer et être aimé

Sur le réseau social Immediam, des utilisateurs peuvent s'abonner au compte d'autres utilisateurs. Si l'utilisateur A s'abonne au compte de B, on dit que A « suit » B.

Ces relations sont schématisées ci-dessous. Dans cette représentation, une flèche allant d'un sommet Α vers un sommet B indique que l'utilisateur A « suit » l'utilisateur B.

flowchart LR
    A([Anna]) --> B([Billy])
    B --> A
    B --> E([Eroll])
    C([Carl]) --> B
    D([Dora]) --> G([Gaby])
    E --> B
    E --> D
    E --> G
    E --> F([Flynn])
    F --> G
    G --> E

On peut observer que Eroll suit Billy, Dora, Flynn et Gaby.

On souhaite établir, pour chaque utilisateur du réseau, la liste des personnes qui le suivent. Ce sont ses abonnés.

Les abonnés de Eroll sont Billy et Gaby. Les abonnés de Gaby sont Dora, Eroll et Flynn.

On représente ce réseau Immediam en machine par un dictionnaire dans lequel :

  • les clés sont les chaînes de caractères correspondant aux noms des utilisateurs,

  • les valeurs associées sont des listes de chaînes de caractères représentant les personnes suivies par cet utilisateur.

Écrire une fonction abonnes qui :

  • prend en argument un dictionnaire reseau représentant un tel réseau Immediam ;

  • renvoie un dictionnaire qui associe à chaque membre du réseau (représenté par une chaine de caractères) la liste de ses abonnés.

Ordre indifférent

La liste des abonnés associée à chaque membre pourra contenir les membres dans n'importe quel ordre.

La fonction comparer utilisée dans les tests permet de valider des ordres différents.

Exemples
>>> petit = {"Anna": ["Basile"], "Basile": []}
>>> abonnes(petit)
{'Anna': [], 'Basile': ['Anna']}
>>> immediam = {
...     "Anna":  ["Billy"],
...     "Billy": ["Anna", "Eroll"],
...     "Carl":  ["Billy"],
...     "Dora":  ["Gaby"],
...     "Eroll": ["Billy", "Dora", "Flynn", "Gaby"],
...     "Flynn": ["Gaby"],
...     "Gaby":  ["Eroll"],
... }
>>> abonnes(immediam)
{'Billy': ['Anna', 'Carl', 'Eroll'], 'Anna': ['Billy'], 'Eroll': ['Billy', 'Gaby'], 'Gaby': ['Dora', 'Eroll', 'Flynn'],'Dora': ['Eroll'], 'Flynn': ['Eroll']}
###(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.913s3_èufv»y naêS1me(P24C:tw«i][hE)6Oo;bcdgM/T0làqABp.r-R,}=k%{5xé050O0s0z0n0C0U0c0l0N0U0n0c0c0*010z0C0Z010406050c0g0r0r0n0#0k040p0K0U0g140K0m0l020n0r0Z0L0l0%0s1e0#0W0g0s0c050R1b1d1f1h190Z041F1M051P0R1P1R1M190O0C0i0|0~10120F0C0P0F0U1)0F0z17050@0M0U0s1!0 11011(1*1,1*0z1=1@1:0z0M0K0O1h1;0#1N0z0F0|1k0c0Z0n0m120v011_1$010h0_0s0m1s0s1:2h2j2o1{2r1@2u0r2w040a0l0u0#0K0Z0K0c0C1n1p0=2f0#0#0s0N2R1F2y0m1N0R2d2%0z2b2a2c0O2A121,0m2t2O1:1X1Z0}1`2;0C2?0m271Y1:0Z2W1N2#2%381a2i1p2|2p310#1e0U170q2!3c183b2z3e1{3g3i170v3m2j3o2#2:013t0n3j040d3x2$193A3r123D3F0w3I3z3c3B3O170.3R3K3T3M3C0K3h3E170I3R1O361F2`2*0O2.3B0N272G0;1Y1N350s373n3,3^0=403q1#1{0+170=0h3,3L47120A170l4d3!4f3C0h170n260m2?1E1G414e2}0116040t4k464y0m172W0c0s0n0g4D3d4m4A0H0y3Y0l4U4j4x3f4H1D4K0g0e4q1o4t3R4W4l4y0K170*4+3p4O4y4A0-4N3U171m0_0C0c0n0z0s0g0#4{3#4A4S4v3y4,4E2p4A0E0D4=4X48170h3%5j4-4Y044~1,5153555p5e1{0K4h042 5y4@5r4I4#574P170)4T4V4?3B49045n565b2$5d5G3s4}145u52545V385Y3B5B175E5W045,3#4G045I4L5K4^175a38064V625?4m5S5U5F4|040Z0s0#0c4)0s683#5.5D0m6h4m5^5`4M5;5Q58170E5|5r5t505(5x6r5k124A0D5 3n61636K6s6n4Z4J4L4%4r4*6C5q1{5g6w5!6a6c6e4s6g6U5z6E175i6)5Z124/040!6Y3N4p0Z6b0m0O6@4z174C6.696y5v5)6~4Q5O4U6M4y5S2W0z556l5;644F6O4#6R6f4u601F433 3-7t0R3:1F0z3=7y2,2(26282*4q1@2%3:1L456/012W0r0e0h0n0+0s0e0F0d171x1z1B1D0l6H3y1O3o1M0J1p0n0l0^0m2P2f0m0i6c140l0=0{5u530{2T1b0N0N1D4J550{2t0l807%2T350:0O0:86105)0c6?1S7,040X0l31530#0l7$7}8j0#0C2W0l0g1p0P0#0n0Z0F1^4L0l2+0n7`6d7}7%8d821^8g8i8k888S2W0i0C2t0z0l0V8z0N8B8D1@4W2+1o0P048H8J8L8O8I7?2N0c0:2!8@0m8_0(0l8{8K1^1B0C7;8c7%0r0o2F0{6e1d0?0{1e507;7`0N9g0l4J7?8T0{1f0N0{2 8R928o1V1Q1i9e0O2j0{86211^2W8g9x0@2R988F1^0h0U0f0N8}3E0~0m8+0O008F9w0K9n8+0Y0l9F8E0m069m2F8+8s2 1X8y8y0U9.5$6z5w8w9@0B9w0g2Q0l0j8ca64 75550l8s5a9I1P7:3#0P1 1.260/2n9M0@0$0z0k6b120C1e0P2w7}520n0$0A0C0O2d124L0z4/aLaB8L1-0zaT1maW0F2W0h1%210Z0c0y0R0R7s0/0!5UaJ0!8Ja.0!0s0O0g0N520C1oa^0#0R2r9%8)6d0R0s0/6c0N0C8k0R0^2F0#0e0?2W4%aH0sbd0/0K0e0%0G0Q0R9a8L0!0c0i0PazaM0$7~0N0$912Qb42k0126219;1:aH0P7;0Ua#01bCaK3#aU1ka!0|8*6c2n0c0#0Na,0za.a:a=3_a@a_0sa{6`8na b1b3b50hb7b91(6#bubgbi1Dbkbsbnbp7VblbtbebwbybAb%bEbG2naPaR0F120d0T0,1:bk2%aq049M9y8=b%8~9N910:980~0l9!9$9(0U9*9,0g9:9=0l0b9^6#9g9|9;9~0l9@a10Ca31Cai746A8w8sac1D8+1b1Y9eah2i8wa5c@a9c-7(7+7L05as4maua!axbIaBaDaF01aH0naJdhaNcvaS01b*dp0$aZ20a$aV2na)0sa+1|a-a/a;a?a^3%a`a|c2b0b22Rb6b8bicabcbecdbjclci2+ckbsbucobzbB8I9b0e0zcsbHaXaNbLbN2ObP1o12bTaV0rbW0rbY3Eb#b%2nb)a%av8+869+b/9wb=b@b_dIb|dK0#dMc1a~dPc50mdSc9bb0cccb=ceewd!bod$br2Fd)bxd+b%d/d;cuaQdsczcB2%0ncE3o2`3B1}1+a!2x6V122C2t2v172I0p8/158+0u0k2d1o3,3~7M39417s7M5R4adD6~5C4j725@4o048P902O6(3a6D6 4B6~6o4!5{f45L044R4+6J7afdfh6P4$0z6m4.4:fw5f174`fk7k049}0?775~fz6W6u6-5+7b2p665o7ifP6ZfGfvfTfd6j5:fOfr7lfjfce#fe5N5;fp7jfQ5mfSf$f+5^fWfI040(fK6^048d0e848!8mf~01f!7hf@6*3Cf(6qf*gb6;8ogf7N5^2Q1y7p4wf+4A0tfnf.6Kfqf+fR5*3nf:fVb1g46Bga7Ng8g65^g1g387g5fDfA047)3Jgv63fUf 6pd/f{6vgPgC85gNgFgpgb6F6~ghfg6_6{6}g$6+ffg@gcfFc+fHg`78gu5Pfd7d0?7ggJgdgZf.7r3_cE3.7w3|7L7.0l7P1f7$8I8xc=7@1ocLf94J8,8t0K0g7`8N9/cKf82h2OcO0lhr7e2Lhy1^cJd-8}2 bP3Ed88p1W1YeW1-eae!gbe%2E2G2I0x1o6e8=e:e=g941e^4?e`7*e|gWb$4A020P0z0Lh}h i11vg:8`hO7VhD91fbgAh`6;4;fYf^17i9faf{71gj696pf{0H3Yh`0Ph|h~i0iwi3f3in5@17eJij4Jd/8 hE4Jg6ieh7f7iIiaili5iEiPikg 17irhafdiu17i3i%iwiAg+gk173^1t1f6ciRg`5^iTcMfaiHi_iKiWf|iNipi~iY7qi!6;0S0#1Cisb{447u7Jhg3/0?0^0`04.