L’autre nuit, j’avais besoin de fabriquer des listes à
trous. Me demandez pas pourquoi, ça m’a pris comme ça… Plus précisément, il me fallait
des listes de longueur arbitraire, se finissant par une plage de trous,
commençant par une première partie avec les entiers dans l’ordre et juste une
certaine proportion de trous.
Si j’avais représenté les trous par des zéros ça aurait
donné ça par exemple : [1, 2, 3, 0, 5, 6, 0, 8, 9, 10, 11, 0, 0, 0, 0, 0, 0, 0].
Ou alors ça [1, 2, 3, 4, 5, 6, 7, 0, 8, 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, 18, 0, 0, 0]. Le genre simple et de bon goût. Et on aurait été vite couché.
...
Ouaip.
...
Seulement voilà, j’ai décidé de représenter les trous par
la valeur booléenne vraie. Qui se dit True en Python. Tout ça pour faire une « liste à True ». Je vous
dis pas après, le reste du code qui utilise ce genre de liste, comment c’est
crade ! Mais bon, « liste à
True » franchement, ça valait la peine ! (ou pas).
Voici le code de génération de la liste. long désigne la
taille de la liste. coef désigne l’inverse de la densité de trous dans la première partie de la liste. stop désigne la fin de la première partie de la liste(*). Par défaut la valeur de stop est choisie au hasard.
from random import randintdef
listeàTrue(long=32, coef=4, stop=0):
stop=stop or randint(1, long-1)
return [1]+[(not randint(0, coef) or i+2) for i in range(stop)]+[True]*(long-stop-1)
print(listeàTrue(256, 10, 128))
Ah oui, ça me revient maintenant pourquoi j’avais besoin de
ça : c’était pour tester un truc. Parce que je suis geek. Et les geeks, ça teste des trucs. Toute ressemblance avec un réplique de Merlin dans Kaamelott Livre VI(**) serait parfaitement volontaire.
(*) Ma vielle obsession des noms de variables faisant pile 4 lettres. Il y en a 456976, en général ça suffit.
(**) Je rappelle que "Livre VI" ça se lit "Livre 6" et pas "Livre Vie-Aïe".
(*) Ma vielle obsession des noms de variables faisant pile 4 lettres. Il y en a 456976, en général ça suffit.
(**) Je rappelle que "Livre VI" ça se lit "Livre 6" et pas "Livre Vie-Aïe".
autre version avec generators :
RépondreSupprimerfrom random import randint
def listaTrue(size=32, coef=4,stop=0):
stop=stop or randint(1,long-1)
return [1]+map(lambda i : not randint(0,coef) or i if (i < stop) else True, xrange(2,long)
print listaTrue(256,10,128))