Cette méthode est plus rapide que les compréhensions de listes imbriquées
[x[:] for x in [[foo] * 10] * 10] # for immutable foo!
Voici quelques timings de python3, pour des petites et grandes listes
$python3 -m timeit '[x[:] for x in [[1] * 10] * 10]'
1000000 loops, best of 3: 1.55 usec per loop
$ python3 -m timeit '[[1 for i in range(10)] for j in range(10)]'
100000 loops, best of 3: 6.44 usec per loop
$ python3 -m timeit '[x[:] for x in [[1] * 1000] * 1000]'
100 loops, best of 3: 5.5 msec per loop
$ python3 -m timeit '[[1 for i in range(1000)] for j in range(1000)]'
10 loops, best of 3: 27 msec per loop
Explication :
[[foo]*10]*10
crée une liste du même objet répété 10 fois. Vous ne pouvez pas utiliser cette méthode, car la modification d'un élément modifiera ce même élément dans chaque rangée !
x[:]
est équivalent à list(X)
mais elle est un peu plus efficace puisqu'elle évite la recherche de noms. Dans tous les cas, elle crée une copie superficielle de chaque ligne, de sorte que tous les éléments sont maintenant indépendants.
Tous les éléments sont les mêmes foo
cependant, donc si foo
est mutable vous ne pouvez pas utiliser ce schéma, vous devez utiliser le schéma suivant
import copy
[[copy.deepcopy(foo) for x in range(10)] for y in range(10)]
ou supposer une classe (ou une fonction) Foo
qui renvoie foo
s
[[Foo() for x in range(10)] for y in range(10)]
11 votes
Juste une petite (ou importante, selon la personne qui regarde) remarque : les listes ne sont pas des tableaux. Si vous voulez des tableaux, utilisez numpy.
0 votes
Cette question est similaire : il traite de l'initialisation des tableaux multidimensionnels en Python.
0 votes
@ArnabDatta Comment initialiser un tableau multidimensionnel dans numpy, alors ?
1 votes
@AndersonGreen docs.scipy.org/doc/numpy/user/
0 votes
Vous pouvez organiser les données dans une structure de type tableau dans le langage Python par défaut, mais elle est loin d'être aussi efficace ou utile qu'un tableau NumPy. Surtout si vous voulez traiter de grands ensembles de données. Voici de la documentation docs.scipy.org/doc/numpy-1.10.1/user/basics.creation.html