109 votes

Python: le moyen le plus rapide pour créer une liste de n listes

Donc, je me demandais comment mieux créer une liste de vide listes:

[[],[],[]...]

En raison de la façon Python fonctionne avec des listes en mémoire, cela ne fonctionne pas:

[[]]*n

Cela crée [[],[],...] , mais chaque élément est la même liste:

d = [[]]*n
d[0].append(1)
#[[1],[1],...]

Quelque chose comme une compréhension de liste des œuvres:

d = [[] for x in xrange(0,n)]

Mais il utilise le Python VM pour faire des boucles. Est-il possible d'utiliser une boucle implicite (en prenant avantage de celui-ci étant écrit en C)?

d = []
map(lambda n: d.append([]),xrange(0,10))

C'est en fait plus lentement. :(

114voto

Sven Marnach Points 133943

Probablement le seul moyen qui est légèrement plus rapide que

d = [[] for x in xrange(n)]

est

from itertools import repeat
d = [[] for i in repeat(None, n)]

Il n'a pas à créer un nouveau int objet dans chaque itération et est d'environ 5 % plus rapide sur ma machine.

Edit: l'Utilisation de NumPy, vous pouvez éviter la boucle à l'aide de Python

d = numpy.empty((n, 0)).tolist()

mais c'est en fait 2,5 fois plus lente que la compréhension de liste.

12voto

delnan Points 52260

Les interprétations de la liste sont effectivement mis en œuvre plus efficacement que les explicite en boucle (voir l' dis sortie par exemple des fonctions) et l' map moyen est d'appeler une ophaque objet appelable à chaque itération, ce qui engage considérable des frais généraux les frais généraux.

Peu importe, [[] for _dummy in xrange(n)] est la bonne façon de le faire et aucun des minuscules (si existant) les différences de vitesse entre les divers autres moyens devraient question. Sauf si bien sûr vous passez la plupart de votre temps à faire cela - mais dans ce cas, vous devez travailler sur votre algorithmes à la place. Combien de fois avez-vous créer ces listes?

12voto

ekta Points 177

Voici deux méthodes, l'une douce et simple(et conceptuelle), les autres plus formelles et peut être prolongée dans une variété de situations, après avoir lu un jeu de données.

Méthode 1: Conceptuel

X2=[]
X1=[1,2,3]
X2.append(X1)
X3=[4,5,6]
X2.append(X3)
X2 thus has [[1,2,3],[4,5,6]] ie a list of lists. 

Méthode 2 : Formel et extensible

Une autre manière de stocker une liste comme une liste de listes de nombres différents, qu'il lit à partir d'un fichier. (Le fichier ici a le dataset train) Le Train est un ensemble de données avec 50 lignes et 20 colonnes. c'est à dire. Train[0] donne-moi la 1ère ligne d'un fichier csv, train[1] donne-moi la 2e rangée et ainsi de suite. Je suis intéressé dans la séparation de l'ensemble de données avec 50 lignes dans une liste, à l'exception de la colonne 0 , ce qui est ma variable expliquée ici, et doit donc être retiré de l'orignal train dataset, puis l'intensification de la liste après la liste - c'est à dire une liste d'une liste. Voici le code qui le fait.

Notez que je suis de lecture à partir de "1" à l'intérieur de la boucle depuis que je m'intéresse à des variables explicatives uniquement. Et je re-initialiser X1=[] dans l'autre boucle, sinon le X2.append([0:(len(train[0])-1)]) est réécrite en X1 et en plus il est plus efficace en terme de mémoire.

X2=[]
for j in range(0,len(train)):
    X1=[]
    for k in range(1,len(train[0])):
        txt2=train[j][k]
        X1.append(txt2)
    X2.append(X1[0:(len(train[0])-1)])

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