Path: csiph.com!news.mixmin.net!aioe.org!yQftVy4DpahetLNbzgJWRw.user.gioia.aioe.org.POSTED!not-for-mail From: Alain Ketterlin Newsgroups: fr.comp.lang.python Subject: Re: pandas switch-on switch-off Date: Tue, 06 Apr 2021 22:00:03 +0200 Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg Lines: 57 Message-ID: <87zgyb89q4.fsf@universite-de-strasbourg.fr.invalid> References: <6066e50d$0$32516$426a74cc@news.free.fr> <60672e97$0$21601$426a74cc@news.free.fr> <606c055d$0$12681$426a74cc@news.free.fr> <606c8f5e$0$3700$426a74cc@news.free.fr> NNTP-Posting-Host: yQftVy4DpahetLNbzgJWRw.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Complaints-To: abuse@aioe.org User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) Cancel-Lock: sha1:JQize7xHvMPAoVivcQWk6PjXOHs= X-Notice: Filtered by postfilter v. 0.9.2 Xref: csiph.com fr.comp.lang.python:3451 Damien Wyart writes: > * Nicolas in fr.comp.lang.python: >> Que se passera t-il si 2 (ou plus) jeux de donn=C3=A9es sont =C3=A0 trai= ter ? > > C'est vrai que j'aurais pu souligner que cette solution est "quick & > dirty" ; vu le contexte qui semblait plus =C3=AAtre un "toy example" qu'a= utre > chose, cela m'avait sembl=C3=A9 int=C3=A9ressant de montrer qu'on pouvait= =C3=A9viter > la boucle "pour le fun". [...] Note que le boucle est cach=C3=A9e dans apply... A tout hasard, en Python cru (ou presque), =C3=A7a s'=C3=A9crirait : | import functools |=20 | df =3D [[0, 0], [0, 0], [1, 0], [0, 0], [0, 1], [0, 0], [0, 0], [0, 1], | [0, 0], [1, 0], [0, 0], [1, 0], [0, 0], [0, 1], [0, 1], [0, 0], | [0, 0], [1, 0], [1, 1], [0, 0]] |=20 | def res (acc, c): | return False if c[1] else c[0] or acc |=20 | r =3D functools.reduce (res, df) J'imagine que pandas doit fournir un truc similaire (=C3=A7a s'appelle fold_left ou reduce traditionnellement, mais comme pandas semble appeler "apply" quelque chose qui s'appelle "map" en g=C3=A9n=C3=A9ral, je m'abstie= ns de deviner ; il y a de bonnes raisons pour l'usage d'autres noms, cela dit). Si tu veux vraiment conserver tous les r=C3=A9sultats interm=C3=A9diaires, = c'est un peu plus sport : | def reslist (accl, c): | lst, state =3D accl | r =3D res (state, c) | return (lst + [c + [r]],r) |=20 | rl =3D functools.reduce (reslist, df, ([],False)) | print (rl[0]) C'est succinct mais ce n'est pas efficace =C3=A0 cause des listes de Python (c'est fait pour des listes fonctionnelles, c=C3=A0d cha=C3=AEn=C3=A9es, pa= s pour des "vecteurs" comme les listes standard). L'appel de reduce construit une nouvelle liste. Si tu cherches la performance, il vaut mieux =C3=A9crire la boucle explicitement, et utiliser append() ou modifier les =C3=A9l=C3=A9men= ts au passage (comme dans ta premi=C3=A8re solution). -- Alain.