Je veux créer une liste vide (ou quelle que soit la meilleure façon) pouvant contenir 10 éléments.
Après cela, je veux attribuer des valeurs dans cette liste, par exemple, cela est censé afficher 0 à 9:
s1 = list();
for i in range(0,9):
s1[i] = i
print s1
Mais lorsque j'exécute ce code, il génère une erreur ou dans un autre cas, il affiche simplement []
(vide).
Quelqu'un peut-il expliquer pourquoi?
[]
), par définition, ne contient aucun élément. Ce que vous voulez apparemment est une liste de valeurs comme falsyNone
,0
ou''
.0
à9
vous devez réellement utiliserfor i in range(0, 10)
, ce qui signifiefor (int i = 0, i < 10, i++)
.Réponses:
Vous ne pouvez pas attribuer à une liste comme
lst[i] = something
, sauf si la liste est déjà initialisée avec au moins desi+1
éléments. Vous devez utiliser append pour ajouter des éléments à la fin de la liste.lst.append(something)
.(Vous pouvez utiliser la notation d'affectation si vous utilisez un dictionnaire).
Création d'une liste vide:
Attribution d'une valeur à un élément existant de la liste ci-dessus:
Gardez à l'esprit que quelque chose comme ça
l[15] = 5
échouerait encore, car notre liste ne contient que 10 éléments.range (x) crée une liste à partir de [0, 1, 2, ... x-1]
Utilisation d'une fonction pour créer une liste:
Compréhension de la liste (en utilisant les carrés parce que pour la portée, vous n'avez pas besoin de faire tout cela, vous pouvez simplement revenir
range(0,9)
):la source
a = [0 for _ in range(10)]
Essayez plutôt ceci:
Ce qui précède créera une liste de taille 10, où chaque position est initialisée à
None
. Après cela, vous pouvez y ajouter des éléments:Certes, ce n'est pas la façon Pythonique de faire les choses. Mieux vaut faire ceci:
Ou encore plus simple , dans Python 2.x, vous pouvez le faire pour initialiser une liste avec des valeurs de 0 à 9:
Et en Python 3.x:
la source
lst = [''] * 10
oulst = [0] * 10
arr = [None for _ in range(10)]
.réponse actuellement acceptée par varunl
Fonctionne bien pour les types non référencés comme les nombres. Malheureusement, si vous souhaitez créer une liste de listes, vous rencontrerez des erreurs de référencement. Exemple en Python 2.7.6:
Comme vous pouvez le voir, chaque élément pointe vers le même objet liste. Pour contourner cela, vous pouvez créer une méthode qui initialisera chaque position à une référence d'objet différente.
Il y a probablement une façon par défaut de python intégrée de faire cela (au lieu d'écrire une fonction), mais je ne suis pas sûr de ce que c'est. Serait heureux d'être corrigé!
Modifier: c'est
[ [] for _ in range(10)]
Exemple :
la source
append
très souvent est inférieure à la compréhension des listes. Vous pouvez créer votre liste de listes via[ [] for _ in range(10)]
.Vous pouvez
.append(element)
à la liste, par exemple:s1.append(i)
. Ce que vous essayez actuellement de faire, c'est d'accéder à un élément (s1[i]
) qui n'existe pas.la source
Il existe deux méthodes "rapides":
Il semble que
[None]*x
c'est plus rapide:Mais si vous êtes d'accord avec une plage (par exemple
[0,1,2,3,...,x-1]
), alors celarange(x)
pourrait être le plus rapide:la source
list(range(n))
place, carrange()
ne renvoie pas de liste mais est un itérateur, et ce n'est pas plus rapide que[None] * n
.Je suis surpris que personne ne propose cette approche simple pour créer une liste de listes vides. Ceci est un vieux fil, mais juste en l'ajoutant pour être complet. Cela va créer une liste de 10 listes vides
la source
x = [[]] * 10
est que dans ce dernier, chaque élément de la liste pointe vers l'objet de liste SAME . Donc, sauf si vous voulez simplement 10 copies du même objet, utilisez larange
variante basée car elle crée 10 nouveaux objets. J'ai trouvé cette distinction très importante.(Ceci a été écrit sur la base de la version originale de la question.)
Toutes les listes peuvent contenir autant d'éléments que vous le souhaitez, sous réserve uniquement de la limite de mémoire disponible. La seule "taille" d'une liste qui compte est le nombre d'éléments qu'elle contient actuellement .
print display s1
n'est pas une syntaxe valide; sur la base de votre description de ce que vous voyez, je suppose que vous vouliez diredisplay(s1)
et ensuiteprint s1
. Pour que cela fonctionne, vous devez avoir préalablement défini un globals1
à passer dans la fonction.L'appel
display
ne modifie pas la liste que vous transmettez, comme écrit. Votre code dit "s1
est un nom pour tout ce qui a été transmis à la fonction; ok, maintenant la première chose que nous ferons est d'oublier complètement cette chose, et commençons às1
faire référence à la place à une nouvellement crééelist
. Maintenant, nous allons la modifierlist
". Cela n'a aucun effet sur la valeur que vous avez transmise.Il n'y a aucune raison de saisir une valeur ici. (Il n'y a pas non plus de raison réelle de créer une fonction, mais c'est à côté du point.) Vous voulez "créer" quelque chose, c'est donc la sortie de votre fonction. Aucune information n'est requise pour créer la chose que vous décrivez, alors ne transmettez aucune information. Pour obtenir des informations,
return
il.Cela vous donnerait quelque chose comme:
Le prochain problème que vous remarquerez est que votre liste n'aura en fait que 9 éléments, car le point final est ignoré par la
range
fonction. (Comme notes secondaires,[]
fonctionne aussi bien quelist()
, le point-virgule n'est pas nécessaire,s1
est un mauvais nom pour la variable, et un seul paramètre est nécessairerange
si vous partez de0
.) Donc, vous vous retrouvez avecCependant, cela manque toujours la marque;
range
n'est pas un mot - clé magique qui fait partie de la langue la voiefor
etdef
sont, mais il est une fonction. Et devinez ce que cette fonction renvoie? C'est vrai - une liste de ces entiers. Donc, la fonction entière s'effondre pouret maintenant vous voyez pourquoi nous n'avons pas du tout besoin d'écrire une fonction;
range
est déjà la fonction que nous recherchons. Bien que, encore une fois, il n'y ait ni besoin ni raison de «redimensionner» la liste.la source
Une façon simple de créer une matrice 2D de taille à l'
n
aide de compréhensions de listes imbriquées:la source
Je suis un peu surpris que le moyen le plus simple de créer une liste initialisée ne se trouve dans aucune de ces réponses. Utilisez simplement un générateur dans la
list
fonction:la source
range(9)
danslist()
? Nerange(9)
renvoie pas déjà une liste?range
n'est pas une liste, ni un générateur. C'est une sous-classe immuable intégrée deSequence
.Voici mon code pour la liste 2D en python qui se lirait non. de lignes de l'entrée:
la source
La réponse acceptée a quelques pièges. Par exemple:
Ainsi, chaque dictionnaire fait référence au même objet. Il en va de même si vous initialisez avec des tableaux ou des objets.
Vous pouvez le faire à la place:
la source
Je suis tombé sur cette question SO alors que je cherchais un problème similaire. J'ai dû construire un tableau 2D, puis remplacer certains éléments de chaque liste (dans un tableau 2D) par des éléments d'un dict. Je suis ensuite tombé sur cette question SO qui m'a aidé, peut-être que cela aidera d'autres débutants à se déplacer. L'astuce clé était d'initialiser le tableau 2D en tant que tableau numpy, puis d'utiliser à la
array[i,j]
place dearray[i][j]
.Pour référence, c'est le morceau de code où j'ai dû utiliser ceci:
Maintenant, je sais que nous pouvons utiliser la compréhension de liste, mais pour des raisons de simplicité, j'utilise une boucle imbriquée pour. J'espère que cela aide les autres qui rencontrent ce message.
la source
Rendez-le plus réutilisable en tant que fonction.
la source
Pour créer une liste, utilisez simplement ces crochets: "[]"
Pour ajouter quelque chose à une liste, utilisez list.append ()
la source
Ce code génère un tableau qui contient 10 nombres aléatoires.
la source