247 votes

Initialisation d'un tableau de taille fixe en Python

Je voudrais savoir comment je peux initialiser un tableau (ou une liste), encore à remplir avec des valeurs, pour avoir une taille définie.

Par exemple en C:

int x[5]; /* déclaré sans ajouter d'éléments */

Comment faire cela en Python?

3 votes

1 votes

3 votes

La question la plus intéressante est pourquoi vous voulez faire cela. La plupart des situations où j'ai vu cela nécessaire sont dues à de mauvaises décisions.

347voto

samplebias Points 19805

Vous pouvez utiliser :

>>> lst = [None] * 5
>>> lst
[None, None, None, None, None]

14 votes

La question spécifiait «.. pas encore peuplé de valeurs». Les docs Python indiquent que "None est généralement utilisé pour représenter l'absence de valeur". Mon exemple a produit une telle liste de la taille définie, dans le plus court code possible. C'est la chose la plus proche en Python idiomatique au moment où la question a été posée.

3 votes

Cela répond aux exigences de la question car vous avez un tableau de taille définie et vous pouvez indexer l'un des cinq éléments sans obtenir d'IndexError. C'est la chose la plus proche de l'expression C.

2 votes

@user2233706 Ce serait plus proche de C si le tableau était rempli de zéros.

109voto

Pat Morin Points 158

Pourquoi ces questions ne reçoivent-elles pas de réponse évidente?

a = numpy.empty(n, dtype=object)

Cela crée un tableau de longueur n qui peut stocker des objets. Il ne peut pas être redimensionné ou ajouté. En particulier, il n'est pas gaspillé d'espace en ajoutant un remplissage à sa longueur. C'est l'équivalent en Python du Java

Object[] a = new Object[n];

Si vous êtes vraiment intéressé par les performances et l'espace et que vous savez que votre tableau ne stockera que certains types numériques, vous pouvez modifier l'argument dtype à une autre valeur comme int. Alors numpy emballera directement ces éléments dans le tableau plutôt que de faire référence à des objets int.

106 votes

Si cela avait été si évident, quelqu'un d'autre l'aurait déjà fourni.. de nouveau, importer une bibliothèque juste pour obtenir cette fonctionnalité pourrait ne pas être la meilleure option.

26 votes

Sauf que c'est la seule réponse ici qui est effectivement correcte. L'OP n'a pas spécifié que le chargement de module était interdit. Il n'a pas non plus demandé une liste. La question est très spécifique et cette réponse est correcte. +1

30 votes

Ajouter un grand module comme numpy est un surmenage inutile

60voto

TTimo Points 75

Faites ceci :

>>> d = [ [ None for y in range( 2 ) ] for x in range( 2 ) ]
>>> d
[[None, None], [None, None]]
>>> d[0][0] = 1
>>> d
[[1, None], [None, None]]

Les autres solutions mèneront à ce genre de problème :

>>> d = [ [ None ] * 2 ] * 2
>>> d
[[None, None], [None, None]]
>>> d[0][0] = 1
>>> d
[[1, None], [1, None]]

3 votes

Il demande à propos de Array pas List

0 votes

Bonne réponse. Le problème que vous mentionnez m'a embrouillé lors d'une compétition de programmation. Savez-vous exactement les mécanismes sous le capot pour provoquer cela?

0 votes

Python copie les "types de données simples" par valeur, et le reste par référence, et il n'est pas toujours clair quand l'un ou l'autre se produit.

17voto

lafras Points 1565

Le meilleur choix est d'utiliser la bibliothèque numpy.

from numpy import ndarray

a = ndarray((5,),int)

2 votes

Et serait-ce le meilleur?

25 votes

Ce n'est pas vraiment le meilleur d'avoir à importer une bibliothèque juste pour utiliser un tableau. D'autres moyens existent.

15voto

kaamen Points 1
>>> import numpy
>>> x = numpy.zeros((3,4))
>>> x
array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]])
>>> y = numpy.zeros(5)   
>>> y
array([ 0.,  0.,  0.,  0.,  0.])

x est un tableau en 2 dimensions, et y est un tableau en 1 dimension. Ils sont tous les deux initialisés avec des zéros.

3 votes

Tu devrais fournir une sorte d'explication ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X