704 votes

Créer une liste vide en Python avec une certaine taille

Je veux créer une liste vide (ou la meilleure façon de le faire) qui peut contenir 10 éléments.

Ensuite, je veux attribuer des valeurs dans cette liste, par exemple, elle est censée afficher de 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 juste [] (vide).

Quelqu'un peut-il expliquer pourquoi ?

1 votes

10 votes

Une "liste vide" ( [] ) a par définition des éléments nuls. Ce que vous voulez apparemment, c'est une liste de valeurs fantaisistes du type None , 0 o '' .

1 votes

Pour générer une liste à partir de 0 a 9 vous devriez en fait utiliser for i in range(0, 10) ce qui signifie for (int i = 0, i < 10, i++) .

1083voto

varunl Points 2425

Vous ne pouvez pas affecter à une liste comme lst[i] = something sauf si la liste est déjà initialisée avec au moins i+1 éléments. Vous devez utiliser append pour ajouter des éléments à la fin de la liste. lst.append(something) .

(Vous pourriez utiliser la notation d'affectation si vous utilisiez un dictionnaire).

Création d'une liste vide :

>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]

Attribution d'une valeur à un élément existant de la liste ci-dessus :

>>> l[1] = 5
>>> l
[None, 5, None, None, None, None, None, None, None, None]

Gardez à l'esprit que quelque chose comme l[15] = 5 échouerait encore, car notre liste ne comporte que 10 éléments.

range(x) crée une liste de [0, 1, 2, ... x-1].

# 2.X only. Use list(range(10)) in 3.X.
>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Utilisation d'une fonction pour créer une liste :

>>> def display():
...     s1 = []
...     for i in range(9): # This is just to tell you how to create a list.
...         s1.append(i)
...     return s1
... 
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]

Compréhension de liste (en utilisant les carrés parce que pour la gamme vous n'avez pas besoin de faire tout cela, vous pouvez simplement retourner range(0,9) ) :

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]

18 votes

Que voulez-vous dire par "Vous ne pouvez pas assigner à une liste comme lst[i] = quelque chose" - bien sûr que vous le pouvez ! Ce que vous ne pouvez pas faire, c'est assigner à un élément inexistant au-delà de la longueur actuelle de la liste.

14 votes

"sauf si la liste est déjà initialisée avec au moins i+1 éléments"....

7 votes

Vous pouvez le faire : a = [0 for _ in range(10)]

155voto

Óscar López Points 97105

Essayez plutôt ceci :

lst = [None] * 10

L'exemple ci-dessus créera une liste de taille 10, où chaque position est initialisée à None . Ensuite, vous pouvez y ajouter des éléments :

lst = [None] * 10
for i in range(10):
    lst[i] = i

Certes, ce n'est pas la façon pythonique de faire les choses. Il vaut mieux faire ça :

lst = []
for i in range(10):
    lst.append(i)

Ou encore plus simple En Python 2.x, vous pouvez faire cela pour initialiser une liste avec des valeurs de 0 à 9 :

lst = range(10)

Et dans Python 3.x :

lst = list(range(10))

5 votes

L'autre avantage de ce système est que vous pouvez initialiser une liste avec des valeurs par défaut. lst = [''] * 10 o lst = [0] * 10

2 votes

Une variante de l'exemple de la compréhension. Si tous les éléments du tableau doivent être vides à l'initialisation, utilisez : arr = [None for _ in range(10)] .

0 votes

Ce format est lst = list(range(10)) a l'air bien. Comme la même longueur en Java int [] arr = new int[10]

130voto

James L. Points 2741

La réponse de varunl actuellement acceptée

 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]

Fonctionne bien pour les types non référencés comme les nombres. Malheureusement, si vous voulez créer une liste de listes, vous rencontrerez des erreurs de référencement. Exemple dans Python 2.7.6 :

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>> 

Comme vous pouvez le constater, chaque élément pointe vers le même objet liste. Pour contourner ce problème, vous pouvez créer une méthode qui initialisera chaque position à une référence d'objet différente.

def init_list_of_objects(size):
    list_of_objects = list()
    for i in range(0,size):
        list_of_objects.append( list() ) #different object reference each time
    return list_of_objects

>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>> 

Il existe probablement un moyen par défaut, intégré à Python, de faire cela (au lieu d'écrire une fonction), mais je ne suis pas sûr de ce que c'est. Je serais heureux d'être corrigé !

Edit : C'est [ [] for _ in range(10)]

Exemple :

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]

21 votes

J'ai entendu dire qu'en utilisant append est très souvent inférieur aux compréhensions de listes. Vous pourriez créer votre liste de listes via [ [] for _ in range(10)] .

14 votes

Upvoted parce que je m'énervais parce que j'avais un tableau multidimensionnel avec les mêmes données répétées plusieurs fois et je n'arrivais pas à comprendre ce qui se passait avant de trouver cette réponse ^^ Je ne comprends pas pourquoi il est si bas ici.

22voto

mgoldwasser Points 377

Il existe deux méthodes "rapides" :

x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]

Il semble que [None]*x est plus rapide :

>>> from timeit import timeit
>>> timeit("[None]*100",number=10000)
0.023542165756225586
>>> timeit("[None for _ in xrange(100)]",number=10000)
0.07616496086120605

Mais si vous êtes d'accord avec une fourchette (par ex. [0,1,2,3,...,x-1] ), alors range(x) pourrait être le plus rapide :

>>> timeit("range(100)",number=10000)
0.012513160705566406

2 votes

Notez qu'en Python3, vous devrez utiliser la commande list(range(n)) à la place, comme range() ne renvoie pas une liste mais un itérateur, et ce n'est pas plus rapide que [None] * n .

20voto

Mohammed Hossain Points 941

Vous pouvez .append(element) à la liste, par exemple : s1.append(i) . Ce que vous essayez de faire actuellement est d'accéder à un élément ( s1[i] ) qui n'existe pas.

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