Liste à trous en Python

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".

1 commentaire:

Anonyme a dit…

autre version avec generators :
from 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))