Meilleur moyen de créer un tableau en Python

Avatar de l’utilisateur
np*

Messages : 0

Inscription : 28 nov. 2015 14:49

Profil de l'utilisateur : Élève de lycée

Meilleur moyen de créer un tableau en Python

Message par np* » 11 déc. 2015 13:28

Bonjour à tous,

Les discussions dans le fil Liste injective m'ont amené à me demander quelle était la meilleur manière de créer en Python un tableau de taille donnée initialisé avec une certaine valeur, pour un débutant, dans le contexte de l'enseignement en CPGE (i.e. Python utilisé comme outil et non comme objectif). Il n'y a pas, à ma connaissance, de fonction qui permette cela dans les librairies standards. Il n'y a d'ailleurs pas vraiment de notion de tableau, même si l'on utilise pour cela les listes natives. Il ne s'agit bien entendu pas ici d'utiliser numpy.

1) La manière pythonique :

Code : Tout sélectionner

tableau = [valeur for _ in range(taille)]
Il me semble que ce serait la "bonne" manière de faire (il n'est censé n'y en avoir qu'une seule de bonne en Python :)). Cependant cela demande d'avoir introduit au préalable la notion de compréhension de liste et cette construction pythonique ne me semble pas appropriée pour commencer.

2) La manière pas incroyable mais je n'ai pas trouvé mieux :

Code : Tout sélectionner

tableau = []
for _ in range(taille):
    tableau.append(valeur)
C'est intuitif et d'une certaine manière correspond à la manière un-tableau-est-une-liste de voir les choses. Pour créer un tableau, il faut créer ses cases de manière successive. Je ne vois pas d'inconvénients majeurs à cette méthode là. Elle fait appel à des notions connues et/ou qui présente un intérêt pour la suite de l'apprentissage. De toutes façon c'est une construction qu'il faudrait connaître, même lorsque l'on sait faire 1).

3) La méthode boguée :

Code : Tout sélectionner

tableau = [valeur] * taille
C'est aussi assez pythonique comme manière de faire et surtout ça ne marche pas toujours pour des raisons qui ne sont pas forcément immédiates pour un débutant. C'est pour cette raison que j'hésiterai même à présenter [0] * 10 pour créer une liste de 10 zéros, cette construction est dangereuse car inévitablement on arrive un jour à faire [[0] * 10] * 10 pour faire une matrice 10x10.

4) La même méthode déboguée:

Code : Tout sélectionner

tableau = [None] * taille
for index in range(taille):
    tableau[index] = valeur
Mouais…

5) Une variante

Code : Tout sélectionner

tableau = list(range(taille))
for index in range(taille):
    tableau[index] = valeur
Mouais++…

Donc, pour l'instant, mieux vaut présenter 2). Qu'en pensez-vous ? Est-ce qu'il y a une autre manière de faire (élégante, efficace, pédagogique) ?

EDIT : Si valeur est non mutable, la solution [valeur] * taille est sans doute la "bonne" solution pour un pur pythoniste, davantage que 1). Mais ce n'est pas le sujet 8)
Dernière modification par np* le 11 déc. 2015 19:06, modifié 7 fois.
$ $P = N\!P^* ?$ $

abouMPSI

Re: Meilleur moyen de créer un tableau en Python

Message par abouMPSI » 11 déc. 2015 13:37

Je ne connais pas du tout le cours suivant à part son titre... Je ne sais pas si c'est pour les débutants, mais au moins, c'est pour les prépas (et même pour les PTSI ! vanne à part).

http://sillages.info/programmation-orie ... ec-python/

Messages : 13

Inscription : 27 févr. 2013 16:45

Profil de l'utilisateur : Élève de lycée

Re: Meilleur moyen de créer un tableau en Python

Message par loupi » 11 déc. 2015 13:52

np* a écrit :Les discussions dans le fil Liste injective m'ont amené à me demander quelle était la meilleur manière de créer en Python un tableau de taille donnée initialisé avec une certaine valeur, pour un débutant, dans le contexte de l'enseignement en CPGE (i.e. Python utilisé comme outil et non comme objectif). Il n'y a pas, à ma connaissance, de fonction qui permette cela dans les librairies standards. Il n'y a d'ailleurs pas vraiment de notion de tableau, même si l'on utilise pour cela les listes natives. Il ne s'agit bien entendu pas ici d'utiliser numpy.

Code : Tout sélectionner

L=[valeur]*taille
ça marche pas ?
Pourquoi est-ce une méthode boguée ?

Avatar de l’utilisateur
np*

Messages : 0

Inscription : 28 nov. 2015 14:49

Profil de l'utilisateur : Élève de lycée

Re: Meilleur moyen de créer un tableau en Python

Message par np* » 11 déc. 2015 14:34

loupi a écrit :

Code : Tout sélectionner

L=[valeur]*taille
ça marche pas ?
Pourquoi est-ce une méthode boguée ?
Essayons. Un livreur à domicile doit approvisionner plusieurs foyers. Chaque semaine cela consiste en une liste de produits de base pour chaque foyer :

Code : Tout sélectionner

>>> courses_de_base = ['sucre', 'pain', 'huile']
Il y a trois foyers :

Code : Tout sélectionner

>>> listes_par_foyer = [courses_de_base] * 3

[['sucre', 'pain', 'huile'],
 ['sucre', 'pain', 'huile'],
 ['sucre', 'pain', 'huile']]
La méthode marche jusqu'ici. Mais maintenant, le livreur met sa liste à jour suite à une demande de dernière nécessité :

Code : Tout sélectionner

>>> listes_par_foyer[1].append('papier toilette')

[['sucre', 'pain', 'huile', 'papier toilette'],
 ['sucre', 'pain', 'huile', 'papier toilette'],
 ['sucre', 'pain', 'huile', 'papier toilette']]
Exercice : comprendre pourquoi :D
$ $P = N\!P^* ?$ $

Messages : 13

Inscription : 27 févr. 2013 16:45

Profil de l'utilisateur : Élève de lycée

Re: Meilleur moyen de créer un tableau en Python

Message par loupi » 11 déc. 2015 14:49

Ok pour plusieurs dimensions, mais pour un tab à 1 dimension ? Ca semble correct d'utiliser [valeur]*taille.

Pour 2d on peut utiliser l=[[valeur for _ in range(taille1)] for _ in range(taille2)] pour en revenir à l'initialisation d'un tableau 2d avec une valeur par défaut, mais bon la syntaxe est rédhibitoire pour débuter.

Avatar de l’utilisateur
np*

Messages : 0

Inscription : 28 nov. 2015 14:49

Profil de l'utilisateur : Élève de lycée

Re: Meilleur moyen de créer un tableau en Python

Message par np* » 11 déc. 2015 19:02

Ce n'est pas vraiment qu'une histoire de dimension. Si on remplace les listes imbriquées par des ensembles, des dictionnaires, ou plus généralement par un objet mutable on rencontre le même problème.

Les méthodes 1, 2, 4, 5 présentent l'avantage de fonctionner dans les cas classique où l'on veut initialiser avec un objet mutable, e.g.

Code : Tout sélectionner

annuaires = [{} for _ in departements]
Cependant, aucune méthode ne marche plus si la valeur a été définie avant (comme dans mon exemple de post précédent qui ne montrait donc pas grand chose...) :

Code : Tout sélectionner

annuaire_vide = {}
annuaires = [annuaire_vide for _ in departements]
ou si on veut définir une fonction :

Code : Tout sélectionner

def initialiser(taille, valeur)
    return [valeur for _ in range(taille)
La solution pythonique est de passer en argument une fonction valeur() qui renvoie un nouvel élément (e.g. int, list, set, lambda : MyObject()). Une autre solution est d'utiliser le module copy (peut-être plus pédagogique sauf pour ceux qui font l'option), mais on quitte le domaine des débutants à nouveau. La solution 3) est la seule qui ne fonctionne alors toujours pas (d'où la dénomination boguée).

Mais à y repenser, je pense que loupi a raison. [valeur] * taille est très bien, à partir du moment où l'on a besoin d'autre chose c'est qu'il est temps de comprendre pourquoi il faut une autre méthode et/ou de voir les compréhensions de liste. Je reste malgré tout attaché à la méthode 2), n'en déplaise aux purs pythonistes.
Dernière modification par np* le 16 déc. 2015 11:26, modifié 2 fois.
$ $P = N\!P^* ?$ $

Messages : 13

Inscription : 27 févr. 2013 16:45

Profil de l'utilisateur : Élève de lycée

Re: Meilleur moyen de créer un tableau en Python

Message par loupi » 11 déc. 2015 21:34

Pour les cas simples d'initialisation (relativement courant à mon avis), les méthodes les plus simples et concises me paraissent les meilleures.
Après, pour les cas plus complexes, on sait à ce niveau en général de quoi on parle, donc il n'y a plus de pb.

Messages : 9679

Inscription : 30 juil. 2008 16:59

Profil de l'utilisateur : Élève de lycée

Re: Meilleur moyen de créer un tableau en Python

Message par fakbill » 11 déc. 2015 22:50

La question n'a pas vraiment de sens.
tableau = [valeur] * taille est correct ***du moment qu'on a compris*** la distinction entre mutable ou non-mutable et ensuite, comme dit, on regarde le module copy.
Si je veux un tableau de False, je crois que j'écris sans réfléchir le machin avec une comprehension list.
Après....ben...sinon beau vraiment faire des choses avec des tableaux....numpy :)
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

Répondre