Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <div class="comment" typeof="schema:UserComments">
  2. <p class="comment-meta">
  3. <span class="comment-author" property="schema:creator">kim</span> le <span class="comment-date" property="schema:commentTime">06/12/2008</span> :
  4. </p>
  5. <div class="comment-content" property="schema:commentText">
  6. <p>en perl, on a droit ?</p>
  7. <p>(my $string = &#39;Ob la di ob la da &quot;rla di da&quot; da &quot;da&quot;&#39; ) =~ s/&quot;//g;<br />my %hash;<br />map { $hash{$_} = (defined $hash{$_}) ? 1 : $hash{$_} + 1; } (split(&quot; &quot;,$string);<br />map { print &quot;$_ -&gt; $hash{$_}\n&quot;; } (keys %hash);</p>
  8. </div>
  9. </div>
  10. <div class="comment" typeof="schema:UserComments">
  11. <p class="comment-meta">
  12. <span class="comment-author" property="schema:creator">maxime</span> le <span class="comment-date" property="schema:commentTime">06/12/2008</span> :
  13. </p>
  14. <div class="comment-content" property="schema:commentText">
  15. <p>kim: voilà qui illustre bien la différence de lisibilité entre le python et le perl ;)</p>
  16. </div>
  17. </div>
  18. <div class="comment" typeof="schema:UserComments">
  19. <p class="comment-meta">
  20. <span class="comment-author" property="schema:creator">David, biologeek</span> le <span class="comment-date" property="schema:commentTime">06/12/2008</span> :
  21. </p>
  22. <div class="comment-content" property="schema:commentText">
  23. <p>@kim : tiens ça me fait penser que je pourrais effectivement virer les &quot; dès le début. Ça me fait aussi penser que perl tiens bien sa réputation ;-).</p>
  24. </div>
  25. </div>
  26. <div class="comment" typeof="schema:UserComments">
  27. <p class="comment-meta">
  28. <span class="comment-author" property="schema:creator">kim</span> le <span class="comment-date" property="schema:commentTime">06/12/2008</span> :
  29. </p>
  30. <div class="comment-content" property="schema:commentText">
  31. <p>@tous les deux : en même temps, j&#39;ai fait exprès de &quot;compresser le code&quot;... M&#39;enfin je trouve le perl plus lisible que le python, question d&#39;habitude :)<br />Cela dit je remarque que j&#39;ai oublié le blacklist et le lowercase. Donc voilà pareil, en reprenant le principe de ton code python (sort + j&#39;ai ajouté lc &amp; blacklist), et sans hash remplie au fur et à mesure :</p>
  32. <p>(my $string = lc(&#39;Ob la di ob la da &quot;rla di da&quot; da &quot;da&quot;&#39;) ) =~ s/&quot;//g;<br />my @string = sort(split(&quot; &quot;,$string));<br />my ($last,%hash) = (&quot;&quot;,);<br />foreach @string {<br /> next if($last eq $_);<br /> next if(!grep {/^$_$/} @blacklist);<br /> $last = $_;<br /> $hash{$_} = scalar(grep { /^$_$/ } @string);<br />}<br /># un peu d&#39;affichage si on veut :<br />#map { print &quot;$_ -&gt; $hash{$_}\n&quot; } (keys %hash);<br />return %hash;</p>
  33. <p>Après, l&#39;utilisation de sort, en perl comme en python, est discutable. Est-ce que trier puis faire un groupby est meilleur en temps &amp; mémoire, par rapport à un stockage &quot;au fil de la lecture&quot; (donc, pas de sort). Dans ton exemple, le texte est court, quid de si on fait le même test sur le texte du code civil par exemple ? ça pourrait être intéressant de faire des tests sur le sujet ;) Je pense que ce genre de questions peut facilement rendre le code un moins &quot;oneline&quot; :)</p>
  34. </div>
  35. </div>
  36. <div class="comment" typeof="schema:UserComments">
  37. <p class="comment-meta">
  38. <span class="comment-author" property="schema:creator">Jdoe</span> le <span class="comment-date" property="schema:commentTime">07/12/2008</span> :
  39. </p>
  40. <div class="comment-content" property="schema:commentText">
  41. <p>@kim, même sans la compression c&#39;est ingérable du code comme ça. dans 6 mois tu retournes dans ta fonction, il te faudra trop de temps pour savoir ce qu&#39;elle fait.</p>
  42. <p>Avant j&#39;aimais bien le perl mais qd on a goûté à la facilité du python, c&#39;est comme une drogue.</p>
  43. </div>
  44. </div>
  45. <div class="comment" typeof="schema:UserComments">
  46. <p class="comment-meta">
  47. <span class="comment-author" property="schema:creator">Jean-Philippe Camguilhem</span> le <span class="comment-date" property="schema:commentTime">07/12/2008</span> :
  48. </p>
  49. <div class="comment-content" property="schema:commentText">
  50. <p>hum hum !</p>
  51. <p>Si je n&#39;ai pas mal compris la doc string de ta fonction :</p>
  52. <p>&quot;&quot;&quot;<br />Compte le nombre d&#39;ocuurences des mots contenus dans un texte (exceptés ceux présents dans la black list).</p>
  53. <p>Retourne un générateur de tuples classés par ordre décroissant de fréquences <br />&quot;&quot;&quot;</p>
  54. <p>Alors ton snipet est buggué dans le sens où il retourne les tuples classés par ordre alphabétique des mots, et non comme indiqué.</p>
  55. <p>Un heureux hasard, trompe le lecteur car ta chanson de départ contient 4 &quot;da&quot;.</p>
  56. <p>remplace les par &quot;za&quot;</p>
  57. <p>&gt;&gt;&gt; song = &#39;Ob la di ob la za &quot;rla di za&quot; za &quot;za&quot;&#39;</p>
  58. <p>Failed example:<br /> for count, word in word_frequencies(song, [&#39;di&#39;]):<br /> print &quot;%s %s&quot; % (count, word)<br />Expected:<br /> 4 za<br /> 2 la<br /> 2 ob<br /> 1 rla<br />Got:<br /> 2 la<br /> 2 ob<br /> 1 rla<br /> 4 za<br />1 items had no tests:<br /> __main__<br />**********************************************************************<br />1 items had failures:<br /> 1 of 2 in __main__.word_frequencies<br />2 tests in 2 items.<br />1 passed and 1 failed.<br />***Test Failed*** 1 failures.</p>
  59. <p>Je laisse aux autres lecteurs le soin de corriger le code à titre d&#39;exercice :)</p>
  60. <p>@++</p>
  61. </div>
  62. </div>
  63. <div class="comment" typeof="schema:UserComments">
  64. <p class="comment-meta">
  65. <span class="comment-author" property="schema:creator">kim</span> le <span class="comment-date" property="schema:commentTime">07/12/2008</span> :
  66. </p>
  67. <div class="comment-content" property="schema:commentText">
  68. <p>@jdoe : bon on va éviter de rentrer dans le troll de bas étage :) mais même sans commentaire, je trouve le code lisible et maintenable. Après, si ce n&#39;est qu&#39;une question de commentaire, c&#39;était voulu, David les avait mis dans son code, je vais pas les *rappeler*.</p>
  69. <p>J&#39;ai curieusement fait exactement l&#39;inverse de toi, j&#39;aimais bien le perl, j&#39;ai goûté au python pendant 6 mois dans le cadre d&#39;un job, hé ben j&#39;en suis revenu au perl pour trois raisons tout à fait subjectives :<br />* plus souple<br />* plus agréable<br />* on n&#39;a pas à s&#39;emmerder avec l&#39;indentation. Et là, par contre, c&#39;est une plaie à mon sens : j&#39;ai récupéré du code modifié par deux personnes, on retrouvait des tabulations, des espaces, c&#39;est super lourd à maintenir (sans compter les copier/coller qu&#39;il faut systématiquement réindenter : le python *nécessite* un éditeur de texte adapté, ce qui n&#39;est pas normal à mon sens).</p>
  70. <p>Après, je suis d&#39;accord que &quot;à lire&quot;, le python peut paraître plus agréable (bon, peut être pas dans l&#39;exemple ci dessus parce qu&#39;il se trouve que le code est *aussi* condensé et on arrive à deux lignes de code contenant au total une douzaine d&#39;instruction...)</p>
  71. </div>
  72. </div>
  73. <div class="comment" typeof="schema:UserComments">
  74. <p class="comment-meta">
  75. <span class="comment-author" property="schema:creator">benoitc</span> le <span class="comment-date" property="schema:commentTime">07/12/2008</span> :
  76. </p>
  77. <div class="comment-content" property="schema:commentText">
  78. <p>en me e temps ce pourrait être plus somple en python :</p>
  79. <p>&gt;&gt;&gt; songs = &#39;Ob la di ob la da &quot;rla di da&quot; da &quot;da&quot;&#39;<br />&gt;&gt;&gt; lsongs = [song.replace(&#39;&quot;&#39;, &#39;&#39;).lower() for song in songs.split()]<br />&gt;&gt;&gt; freqs = [(- lsongs.count(song), song) for song in set(lsongs)]<br />&gt;&gt;&gt; print &quot;\n&quot;.join(&quot;%-10s : %s&quot; % (n, -f) for f, n in sorted(freqs))<br />da : 4<br />di : 2<br />la : 2<br />ob : 2<br />rla : 1</p>
  80. </div>
  81. </div>
  82. <div class="comment" typeof="schema:UserComments">
  83. <p class="comment-meta">
  84. <span class="comment-author" property="schema:creator">benoitc</span> le <span class="comment-date" property="schema:commentTime">07/12/2008</span> :
  85. </p>
  86. <div class="comment-content" property="schema:commentText">
  87. <p>autre possibilité :</p>
  88. <p>&gt;&gt;&gt; songs = &#39;Ob la di ob la da &quot;rla di da&quot; da &quot;da&quot;&#39;<br />&gt;&gt;&gt; lsongs = [song.replace(&#39;&quot;&#39;, &#39;&#39;).lower() for song in songs.split()]<br />&gt;&gt;&gt; freqs = [lsongs.count(song) for song in lsongs]<br />&gt;&gt;&gt; dict(zip(lsongs, freqs))<br />{&#39;da&#39;: 4, &#39;di&#39;: 2, &#39;rla&#39;: 1, &#39;ob&#39;: 2, &#39;la&#39;: 2}</p>
  89. <p>perso dans ls 2 cas je trouve le python plus lisible que le perl .... les $_ me semblant pas naturel (surtout pour un français). Pour les badwords il suffit de mettre un son in songs.split() and not in badwords .</p>
  90. </div>
  91. </div>
  92. <div class="comment" typeof="schema:UserComments">
  93. <p class="comment-meta">
  94. <span class="comment-author" property="schema:creator">jean-Philippe Camguilhem</span> le <span class="comment-date" property="schema:commentTime">07/12/2008</span> :
  95. </p>
  96. <div class="comment-content" property="schema:commentText">
  97. <p>Bon benoitc n&#39;a pas trainé pour corriger.</p>
  98. <p>J&#39;aime beaucoup sa façon originale de trier de façon inverse en passant par des valeurs négatives dans sa première proposition.</p>
  99. <p>J&#39;en profite cependant pour placer une méthode souvent méconnue pour les tris de listes à plusieurs dimensions.</p>
  100. <p>sorted tri sur le premier élément, mais on peut lui demander de trier sur un autre élément via operator :</p>
  101. <p>&gt;&gt;&gt; import operator<br />&gt;&gt;&gt; words_frequencies=((&#39;za&#39;, 4), (&#39;rla&#39;, 1), (&#39;la&#39;, 2), (&#39;ob&#39;, 2))<br />&gt;&gt;&gt; print sorted(words_frequencies, key=operator.itemgetter(1), reverse=True)<br />[(&#39;za&#39;, 4), (&#39;la&#39;, 2), (&#39;ob&#39;, 2), (&#39;rla&#39;, 1)]</p>
  102. <p>@++</p>
  103. <p>@kim pour connaître la réponse au match perl vs python<br />il faudra repasser vendredi sur cette url :)<br /><a href="http://jp.camguilhem.net/?user=kim&amp;cool=perl&amp;bad=python">http://jp.camguilhem.net/?user=kim&amp;cool=perl&amp;bad=python</a></p>
  104. </div>
  105. </div>
  106. <div class="comment" typeof="schema:UserComments">
  107. <p class="comment-meta">
  108. <span class="comment-author" property="schema:creator">benoitc</span> le <span class="comment-date" property="schema:commentTime">07/12/2008</span> :
  109. </p>
  110. <div class="comment-content" property="schema:commentText">
  111. <p>Je n&#39;utilis epas svt operator, une autre solution si on veut trier :</p>
  112. <p>&gt;&gt;&gt; songs = &#39;Ob la di ob la da &quot;rla di da&quot; da &quot;da&quot;&#39;<br />&gt;&gt;&gt; lsongs = [song.replace(&#39;&quot;&#39;, &#39;&#39;).lower() for song in songs.split()]<br />&gt;&gt;&gt; freqs = [lsongs.count(song) for song in set(lsongs)]<br />&gt;&gt;&gt; a = zip(lsongs,freqs)<br />&gt;&gt;&gt; a.sort(lambda a,b: cmp(a[1],b[1]))<br />&gt;&gt;&gt; a<br />[(&#39;di&#39;, 1), (&#39;la&#39;, 2), (&#39;ob&#39;, 2), (&#39;la&#39;, 2), (&#39;ob&#39;, 4)]</p>
  113. </div>
  114. </div>
  115. <div class="comment" typeof="schema:UserComments">
  116. <p class="comment-meta">
  117. <span class="comment-author" property="schema:creator">benoitc</span> le <span class="comment-date" property="schema:commentTime">07/12/2008</span> :
  118. </p>
  119. <div class="comment-content" property="schema:commentText">
  120. <p>Bon suite à un question de Kael qui m&#39;a titillé j&#39;allais poser ici l&#39;algo en erlang quand j&#39;ai vu que mon dernier exemple était faux. Ceci est plus correct :</p>
  121. <p>&gt;&gt;&gt; songs = &#39;Ob la di ob la da &quot;rla di da&quot; da &quot;da&quot;&#39;<br />&gt;&gt;&gt; lsongs = [song.replace(&#39;&quot;&#39;, &#39;&#39;).lower() for song in songs.split()]<br />&gt;&gt;&gt; freqs = [lsongs.count(song) for song in lsongs]<br />&gt;&gt;&gt; a = dict(zip(lsongs, freqs))<br />&gt;&gt;&gt; a<br />{&#39;da&#39;: 4, &#39;di&#39;: 2, &#39;rla&#39;: 1, &#39;ob&#39;: 2, &#39;la&#39;: 2}<br />&gt;&gt;&gt; items = a.items()<br />&gt;&gt;&gt; items.sort(lambda a, b: cmp(a[1], b[1]))<br />&gt;&gt;&gt; items<br />[(&#39;rla&#39;, 1), (&#39;di&#39;, 2), (&#39;ob&#39;, 2), (&#39;la&#39;, 2), (&#39;da&#39;, 4)]</p>
  122. <p>et reverse pour l&#39;inverse...</p>
  123. <p>En erlang cela donne :</p>
  124. <p>1&gt; S = &quot;Ob la di ob la da \&quot;rla di da\&quot; da \&quot;da\&quot;&quot;,<br />1&gt; Map = lists:map(fun(Word) -&gt; {string:to_lower(Word),1} end, string:tokens(S, &quot; \&quot;&quot;)),<br />1&gt; Result = lists:foldl(fun({Word,_}, Dict) -&gt;<br />1&gt; case dict:is_key(Word, Dict) of <br />1&gt; true -&gt; dict:store(Word, dict:fetch(Word, Dict) + 1, Dict);<br />1&gt; false -&gt; dict:store(Word, 1, Dict)<br />1&gt; end<br />1&gt; end, dict:new(), Map),<br />1&gt; dict:fold(fun(Word, Freq, Acc) -&gt; [{Word,Freq}|Acc] end, [], Result).<br />[{&quot;da&quot;,4},{&quot;rla&quot;,1},{&quot;ob&quot;,2},{&quot;di&quot;,2},{&quot;la&quot;,2}]</p>
  125. <p><a href="http://friendpaste.com/Hy6KzphN">http://friendpaste.com/Hy6KzphN</a></p>
  126. <p>(mis sur friendpaste car ton système n&#39;accepte pas les &quot;+ 1&quot; dans les posts!)</p>
  127. <p></p>
  128. </div>
  129. </div>
  130. <div class="comment" typeof="schema:UserComments">
  131. <p class="comment-meta">
  132. <span class="comment-author" property="schema:creator">scar</span> le <span class="comment-date" property="schema:commentTime">08/12/2008</span> :
  133. </p>
  134. <div class="comment-content" property="schema:commentText">
  135. <p>En php :<br />&lt;?php<br />$song = &#39;Ob la di ob la da &quot;rla di da&quot; da &quot;da&quot;&#39;;<br />$res = array();<br />foreach (preg_split(&#39;/\W/i&#39;, $song) as $w) <br /> if(!empty($w)) ++$res[$w];<br />natsort($res);<br />var_export($res);<br />?&gt;<br />Résultat :<br />array (<br /> &#39;Ob&#39; =&gt; 1,<br /> &#39;rla&#39; =&gt; 1,<br /> &#39;ob&#39; =&gt; 1,<br /> &#39;di&#39; =&gt; 2,<br /> &#39;la&#39; =&gt; 2,<br /> &#39;da&#39; =&gt; 4,<br />)<br />Avec array_reverse($res, true) pour le résultat inverse.</p>
  136. <p>Après le choix du language, c&#39;est bien souvent une question de goût :)</p>
  137. </div>
  138. </div>
  139. <div class="comment" typeof="schema:UserComments">
  140. <p class="comment-meta">
  141. <span class="comment-author" property="schema:creator">vincent rabah</span> le <span class="comment-date" property="schema:commentTime">11/12/2008</span> :
  142. </p>
  143. <div class="comment-content" property="schema:commentText">
  144. <p>Sous (L)unix il existe une commande qui est &quot;wc&quot; qui renvoie le nombre de mots d&#39;un texte et &quot;wc -l&quot; qui renvoie le nombre de ligne d&#39;un texte :)</p>
  145. </div>
  146. </div>
  147. <div class="comment" typeof="schema:UserComments">
  148. <p class="comment-meta">
  149. <span class="comment-author" property="schema:creator">Olivier</span> le <span class="comment-date" property="schema:commentTime">16/12/2008</span> :
  150. </p>
  151. <div class="comment-content" property="schema:commentText">
  152. <p>Un minuscule détail: je ne mettrais pas de backslash du tout, si j&#39;étais toi. C&#39;est même recommandé dans la doc python: <a href="http://docs.python.org/howto/doanddont.html#using-backslash-to-continue-statements">http://docs.python.org/howto/doanddont.html#using-backslash-to-continue-statements</a></p>
  153. </div>
  154. </div>
  155. <div class="comment" typeof="schema:UserComments">
  156. <p class="comment-meta">
  157. <span class="comment-author" property="schema:creator">DecIRC</span> le <span class="comment-date" property="schema:commentTime">18/12/2008</span> :
  158. </p>
  159. <div class="comment-content" property="schema:commentText">
  160. <p>@vincent : un peu simpliste, non ? On demande pas le nombre de mots du texte mais le nombre d&#39;occurences de chaque mot.</p>
  161. <p>cEd</p>
  162. </div>
  163. </div>
  164. <div class="comment" typeof="schema:UserComments">
  165. <p class="comment-meta">
  166. <span class="comment-author" property="schema:creator">benoitc</span> le <span class="comment-date" property="schema:commentTime">21/12/2008</span> :
  167. </p>
  168. <div class="comment-content" property="schema:commentText">
  169. <p>oui en shell ce serait plutôt :</p>
  170. <p>sed -e &#39;s/\.//g&#39; -e &#39;s/\,//g&#39; -e &#39;s/ /\<br />/g&#39; /filepath | tr &#39;A-Z&#39; &#39;a-z&#39; | sort | uniq -c | sort -nr</p>
  171. </div>
  172. </div>