Comment initialiser un tableau à deux dimensions en Python?
Je suis débutant en python et je suis en train d'utiliser, en deux dimensions, liste, que j'ai d'abord remplir avec la même variable dans chaque lieu. Je suis venu avec cette:
def initialize_twodlist(foo):
twod_list = []
new = []
for i in range (0, 10):
for j in range (0, 10):
new.append(foo)
twod_list.append(new)
new = []
Il donne le résultat souhaité, mais se sent comme une solution de contournement. Est-il plus facile/plus court/moyen plus élégant de faire cela?
- Juste un petit (ou importante, en fonction de qui est de regarder) pinaille : les listes ne sont pas des tableaux. Si vous voulez des tableaux, utiliser numpy.
- Cette question est similaire: il traite de l'initialisation de tableaux multidimensionnels en Python.
- Comment feriez-vous pour initialiser un tableau multidimensionnel dans numpy, alors?
- docs.scipy.org/doc/numpy/user/...
- Vous pouvez organiser les données dans un tableau comme structure par défaut de Python, mais il n'est pas presque aussi efficace ou utile comme un tableau NumPy. Surtout si vous voulez traiter de grands ensembles de données. Voici un peu de documentation docs.scipy.org/doc/numpy-1.10.1/user/basics.creation.html
Vous devez vous connecter pour publier un commentaire.
Un modèle qui est revenu souvent dans Python a été
qui ont contribué à motiver l'introduction des interprétations de la liste, qui convertissent ce morceau de code à
qui est plus court et parfois plus clair. En général, vous obtenez l'habitude de reconnaissance de ces et souvent le remplacement des boucles avec des inclusions.
Votre code suit le modèle deux fois
[foo] * 10
une liste avec exactement la mêmefoo
10 fois, ce qui peut ou peut ne pas être important.[foo] * 10
: Cela signifie que ce ne serait pas de travail si vous êtes le remplissage d'un tableau avec des nombres aléatoires (évalue[random.randint(1,2)] * 10
à[1] * 10
ou[2] * 10
ce qui signifie que vous obtenez un tableau de tous les 1s ou 2s, au lieu d'un ensemble aléatoire.Vous pouvez utiliser un compréhension de liste:
i
pour les lignes etj
pour les colonnes, je pense qu'il devrait être mieux swapi
etj
dans votre syntaxe permettant de mieux comprendre et de modifier la gamme de 2 numéros différents.Cette méthode est plus rapide de la liste imbriquée interprétations de la
Voici quelques python3 timings, pour les petites et les grandes listes
Explication:
[[foo]*10]*10
crée une liste des le même objet répété 10 fois. Vous ne pouvez pas utiliser, parce que la modification d'un élément ne permet de modifier le même élément dans chaque ligne!x[:]
est équivalent àlist(X)
mais est un peu plus efficace, car elle évite la recherche de nom. De toute façon, il crée une copie de chaque ligne, de sorte que maintenant, tous les éléments sont indépendants.Tous les éléments sont les mêmes
foo
objet, sifoo
est mutable, vous ne pouvez pas utiliser ce dispositif., vous devez utiliser leou dans l'hypothèse d'une classe (ou une fonction)
Foo
qui renvoiefoo
scopy.deepcopy
n'est pas fiable et pas quelque chose d'utile très souvent.copy.deepcopy
. Vous avez besoin d'un plan spécifique à vos données si vous avez un arbitraire mutable objet.__ deepcopy __
. C'est là que "le plan spécifique pour le type de données" appartient. gnibbler: Merci, Le propriétédeepcopy solution est parfait pour la commune mutable cas où foo est une liste vide!foo = None
avant de cette ligne, la bonne façon de faire? (au moins tous semble fonctionner comme prévu à l'époque) MODIFIER: Ahh, je l'ai eu. Le domaine devient initialisé avec la valeur que je attribuer à la variable première. Ainsi, unfoo = 0
au début serait init 2d-tableau avec les zéros... Jamais l'esprit 🙂x
ety
. Ne devrait-elle pas être[[copy.deepcopy(foo) for y in range(10)] for x in range(10)]
int
oustr
.Ne pas utiliser [[v]*n]*n, c'est un piège!
mais
t = [ [0]*3 for i in range(3)]
est grande
*
est la copie de laaddress
de l'objet (liste).Pour initialiser un tableau à deux dimensions en Python:
a = [[0 for x in range(columns)] for y in range(rows)]
.[[0] * col] * row
ne pas faire ce que vous voulez, c'est parce que lorsque vous initialisez un 2d liste de cette façon, Python ne va pas créer des copies distinctes de chacune des lignes. Au lieu de cela il va init la liste externe avec des pointeurs vers la même copie de[0]*col
. Toute modification que vous apportez à l'une des lignes sera ensuite prise en compte dans les lignes restantes, car ils sont tous réellement pointant vers les mêmes données dans la mémoire.Habituellement, lorsque vous voulez les tableaux multidimensionnels vous ne voulez pas d'une liste de listes, mais plutôt un tableau numpy ou peut-être un dict.
Par exemple, avec numpy vous ferais quelque chose comme
numpy
est grand, je pense qu'il pourrait être un peu exagéré pour un débutant.numpy
. +1Vous pouvez faire tout cela:
Par exemple:
Mais cela a un effet secondaire non désiré:
Si c'est un peu densément peuplées tableau, vous pourriez être mieux à l'aide d'un dictionnaire à clé avec un n-uplet:
pour n est le nombre de lignes, et m est le nombre de colonne, et foo est la valeur.
utilisation la plus simple de penser à créer cette.
et ajouter la taille:
ou si nous voulons déclarer la taille d'abord. nous utilisons uniquement:
Approche incorrecte: [[Néant*m]*n]
Avec cette approche, python ne permet pas la création d'espace d'adressage différent pour les colonnes extérieures et conduira à différentes débordements que votre attente.
Approche correcte mais avec l'exception:
C'est une bonne approche mais il y a une exception si vous définissez la valeur par défaut pour
None
Afin de définir votre valeur par défaut correctement à l'aide de cette approche.
Absolue correct:
Suivre le mike réponse double boucle.
pour chaque élément, une nouvelle
[0]*10
sera créé ..Comme @Arnab et @Mike l'a souligné, un tableau n'est pas une liste. Peu de différences sont: 1) les tableaux sont de taille fixe lors de l'initialisation 2) les tableaux normalement soutien moins d'opérations que une liste.
Peut-être inutile dans la plupart des cas, mais ici, c'est un tableau 2d de mise en œuvre qui exploite le matériel de la matrice de mise en œuvre à l'aide de python ctypes(bibliothèques c)
Vous pouvez essayer ce [[0]*10]*10. Ce sera le retour de la 2d tableau de 10 lignes et 10 colonnes avec la valeur 0 pour chaque cellule.
C'est la meilleure que j'ai trouvé pour l'enseignement de nouveaux programmeurs, et sans l'aide de bibliothèques supplémentaires. J'aimerais quelque chose de meilleur.
Ici est un moyen plus facile :
Pour l'initialisation de toutes les cellules avec tous les 'x' valeur d'utilisation :
Souvent j'utilise cette approche pour l'initialisation d'un tableau en 2 dimensions
n=[[int(x) for x in input().split()] for i in range(int(input())]
Le modèle général pour ajouter des dimensions peuvent être tirées de cette série: