896 Stimmen

Eine leere Liste mit einer bestimmten Größe in Python erstellen

Wie kann ich eine leere Liste erstellen, die 10 Elemente enthalten kann?

Danach möchte ich in dieser Liste Werte zuweisen. Zum Beispiel:

xs = list()
for i in range(0, 9):
   xs[i] = i

Das ergibt jedoch IndexError: list assignment index out of range . Warum?


Anmerkung der Redaktion:

In Python werden Listen <strong>haben keine festgelegte Kapazität </strong>aber es ist nicht möglich, Elemente zuzuweisen, die nicht bereits vorhanden sind. Die Antworten hier zeigen Code, der eine Liste mit 10 "Dummy"-Elementen erstellt, die später ersetzt werden können. Die meisten Anfänger, die auf dieses Problem stoßen, werden jedoch <em>wirklich nur eine Liste durch Hinzufügen von Elementen erstellen wollen </em>. Dies sollte unter Verwendung der <code>.append</code> Methode, obwohl es oft problemspezifische Möglichkeiten gibt, die Liste direkter zu erstellen. Siehe bitte <a href="https://stackoverflow.com/questions/5653533">Warum gibt dieser iterative Listenerweiterungscode IndexError: list assignment index out of range? Wie kann ich wiederholt Elemente zu einer Liste hinzufügen? </a>für Einzelheiten.

1331voto

varunl Punkte 18161

Sie können einer Liste nicht zuordnen wie xs[i] = value , es sei denn, die Liste ist bereits mit mindestens i+1 Elemente. Verwenden Sie stattdessen xs.append(value) um Elemente an das Ende der Liste anzufügen. (Sie könnten allerdings auch die Zuweisungsnotation verwenden, wenn Sie ein Wörterbuch statt einer Liste verwenden würden).

Erstellen einer leeren Liste:

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

Zuweisung eines Wertes an ein bestehendes Element der obigen Liste:

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

Denken Sie daran, dass etwas wie xs[15] = 5 würde trotzdem fehlschlagen, da unsere Liste nur 10 Elemente hat.

range(x) erstellt eine Liste aus [0, 1, 2, ... x-1]

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

Verwendung einer Funktion zur Erstellung einer Liste:

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

List comprehension (Mit den Quadraten, weil für den Bereich Sie nicht brauchen, um all dies zu tun, können Sie einfach zurück range(0,9) ) :

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

226voto

Óscar López Punkte 224631

Versuchen Sie stattdessen dies:

lst = [None] * 10

Das obige Beispiel erstellt eine Liste der Größe 10, in der jede Position initialisiert ist mit None . Danach können Sie ihm Elemente hinzufügen:

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

Zugegeben, das ist nicht die pythonische Art, Dinge zu tun. Machen Sie lieber das:

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

Oder noch einfacher In Python 2.x können Sie auf diese Weise eine Liste mit Werten von 0 bis 9 initialisieren:

lst = range(10)

Und in Python 3.x:

lst = list(range(10))

157voto

James L. Punkte 9533

Varunl's derzeit akzeptierte Antwort

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

Funktioniert gut für Nicht-Referenztypen wie Zahlen. Wenn Sie eine Liste von Listen erstellen wollen, werden Sie leider auf Fehler bei der Referenzierung stoßen. Beispiel in Python 2.7.6:

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

Wie Sie sehen können, verweist jedes Element auf dasselbe Listenobjekt. Um dies zu umgehen, können Sie eine Methode erstellen, die jede Position mit einer anderen Objektreferenz initialisiert.

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], [], [], [], [], [], [], [], [], []]
>>> 

Es gibt wahrscheinlich eine standardmäßige, eingebaute Python Weg, dies zu tun (statt eine Funktion zu schreiben), aber ich bin nicht sicher, was es ist. Ich würde mich freuen, korrigiert zu werden!

Bearbeiten: Es ist [ [] for _ in range(10)]

例:

>>> [ [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]]

26voto

Bow Punkte 917

Ich bin überrascht, dass niemand diesen einfachen Ansatz zur Erstellung einer Liste leerer Listen vorgeschlagen hat. Dies ist ein alter Thread, aber ich füge ihn nur der Vollständigkeit halber hinzu. So wird eine Liste mit 10 leeren Listen erstellt

x = [[] for i in range(10)]

23voto

mgoldwasser Punkte 12992

Es gibt zwei "schnelle" Methoden:

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

Es scheint, dass [None]*x ist schneller:

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

Wenn Sie jedoch mit einem Bereich einverstanden sind (z. B. [0,1,2,3,...,x-1] ), dann range(x) könnte am schnellsten sein:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X