Création liste taille n, ss-liste taille N

fifi21
Modifié (January 2022) dans Informatique théorique
Bonjour à tous,
j'aimerais créer une fonction $f(n,N)$ qui crée une liste L composée de n sous-listes de taille N, dont chaque coefficient est un nombre aléatoire (0 ou 1). Ensuite, il faudrait un compteur qui augmente de 1 dès qu'il y a au moins un 1 dans chacune des sous-listes.

si j'écris
def f(n,N):
    liste=[]
    for i in range (n):
        liste.append([random.randint(0,1)]*N)
    return liste
j'obtiens que chaque membre de chaque sous liste est composé du même nombre aléatoire (0 ou 1), or je voudrais quelque chose du type (pour N=3) [[1,0,0],[0,1,1],[0,0,0],[0,1,0]...]

Bonne fin de journée.

Réponses

  • Il suffit de remplacer la ligne
    liste.append([random.randint(0,1)]*N)
    
    par
    liste.append([random.randint(0,1) for i in range(N)])
    
    sinon, comme tu l'as remarqué, c'est la même instanciation de
    random.randint(0,1)
    
    qui est copiée dans chacune des cases de la liste.

    En fait, en utilisant la compréhension de liste, tu peux même faire toute la fonction $f$ en une seule ligne :
    def f(n, N):
        return [[random.randint(0,1) for i in range(N)] for j in range(n)]
    

    Quant à ton compteur, je te laisse le faire, mais ce n'est pas très difficile.
  • Personnellement j'ai une violente réaction épidermique quand je vois un "append" dans un programme ; j'aurais utilisé la chose suivante :
    n,N = (50, 10)
    Mat = np.random.randint(2, size=(n,N))
    List = np.ndarray.tolist(Mat)
    

    Peut-être ai-je mal compris
  • désolé pour votre allergie ;) je fais avec mon niveau en Python (qui n'est donc pas très très élevé)
  • "append" c'est de l'allocation dynamique de mémoire, et ça coûte très cher; à n'utiliser qu'en dernier recours.

    A minima, la bonne méthode consiste:
    • soit à initialiser ta matrice et ensuite remplir les "cases"
    • soit à utiliser un module ou une bibliothèque qui le fait directement pour toi (c'est le cas de numpy dans le cas présent)

    Je te laisse tester avec n=100_000 par exemple et tu verras la différence
  • paul18 : Il faut savoir nuancer. En premier lieu, il vaut mieux savoir faire quelque chose qui marche, et ensuite chercher à l'améliorer, voire changer de méthode, si ce n'est pas assez performant.

    Ceci étant, puisque dans le cas présent il y a une fonction toute faite dans numpy...
  • L'initialisation (variables, tableaux, matrices...) fait partie des des b-a-ba.
    Pour numpy, c'est juste un partage d'information.
Connectez-vous ou Inscrivez-vous pour répondre.