it-swarm.com.de

Erstellen Sie eine leere Liste mit bestimmter Größe in Python

Ich möchte eine leere Liste erstellen (oder wie auch immer der beste Weg ist), die 10 Elemente enthalten kann.

Danach möchte ich Werte in dieser Liste zuweisen, zum Beispiel soll dies 0 bis 9 anzeigen:

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

print  s1

Beim Ausführen dieses Codes wird jedoch ein Fehler generiert, oder in einem anderen Fall wird [] (leer) angezeigt. 

Kann jemand erklären warum?

Sie können keine Liste wie lst[i] = something zuweisen, es sei denn, die Liste ist bereits mit mindestens i+1 Elementen initialisiert. Sie müssen append verwenden, um Elemente am Ende der Liste hinzuzufügen. lst.append(something).

(Sie könnten die Zuweisungsnotation verwenden, wenn Sie ein Wörterbuch verwenden).

Erstellen einer leeren Liste:

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

Zuweisen eines Werts zu einem vorhandenen Element der obigen Liste:

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

Denken Sie daran, dass etwas wie l[15] = 5 immer noch fehlschlagen würde, da unsere Liste nur 10 Elemente enthält.

range (x) erstellt eine Liste aus [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]

Verwenden einer Funktion zum Erstellen einer 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]

Listenverständnis (Verwenden Sie die Quadrate, da Sie für den Bereich nicht alles tun müssen. Sie können einfach range(0,9) zurückgeben.):

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

Versuchen Sie es stattdessen:

lst = [None] * 10

Daraufhin wird eine Liste der Größe 10 erstellt, in der jede Position mit None initialisiert wird. Danach können Sie Elemente hinzufügen:

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

Zugegeben, das ist nicht der pythonische Weg, Dinge zu tun. Besser machen Sie das:

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

Oder noch besser , benutze Listenverständnisse wie folgt:

[i for i in range(10)]
100
Óscar López

varunls derzeit akzeptierte Antwort

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

Funktioniert gut für Nichtreferenztypen wie Zahlen. Wenn Sie eine Liste von Listen erstellen möchten, werden Sie leider auf Verweisungsfehler 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, zeigt 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, integrierte Python-Methode, um dies zu tun (anstatt eine Funktion zu schreiben), aber ich bin mir nicht sicher, was es ist. Würde mich freuen, korrigiert zu werden! 

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

Beispiel: 

>>> [ [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]]
55
James L.

Sie können .append(element) zur Liste hinzufügen, z. B. s1.append(i). Sie versuchen derzeit, auf ein Element (s1[i]) zuzugreifen, das nicht vorhanden ist.

17

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 schneller ist:

>>> 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 zufrieden sind (z. B. [0,1,2,3,...,x-1]), ist range(x) möglicherweise am schnellsten:

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

(Dies wurde basierend auf der Originalversion der Frage geschrieben.)

Ich möchte eine leere Liste erstellen (oder was auch immer der beste Weg ist), die 10 Elemente enthalten kann.

Alle Listen können so viele Elemente enthalten, wie Sie möchten, wobei nur der verfügbare Speicherplatz begrenzt ist. Die einzige "Größe" einer Liste, die zählt, ist die Anzahl der Elemente derzeit darin.

aber wenn ich es laufen lasse, ist das Ergebnis []

print display s1 ist keine gültige Syntax; Ich gehe davon aus, dass Sie auf der Grundlage Ihrer Beschreibung von was Sie sehen, display(s1) und dann print s1. Dazu müssen Sie zuvor einen globalen s1 definiert haben, der an die Funktion übergeben werden kann.

Durch den Aufruf von display wird die von Ihnen übergebene Liste nicht geändert. Ihr Code sagt, "s1 ist ein Name für alles, was an die Funktion übergeben wurde. Okay, jetzt vergessen wir das Ding vollständig und lassen s1 beginnen, stattdessen auf ein neu erstelltes list zu verweisen. ll ändere diese list ". Dies hat keinen Einfluss auf den eingegebenen Wert.

Es gibt keinen Grund, hier einen Wert anzugeben. (Es gibt auch keinen wirklichen Grund, eine Funktion zu erstellen, aber das ist nicht der Punkt.) Sie möchten etwas "erstellen", also ist dies die Ausgabe Ihrer Funktion. Es sind keine Informationen erforderlich, um das von Ihnen beschriebene Objekt zu erstellen. Geben Sie also keine Informationen weiter. Um Informationen abzurufen, return.

Das würde Ihnen so etwas geben:

def display():
    s1 = list();
    for i in range(0, 9):
        s1[i] = i
    return s1

Das nächste Problem, das Sie beachten werden, ist, dass Ihre Liste tatsächlich nur 9 Elemente enthält, da der Endpunkt von der range-Funktion übersprungen wird. (Als Randbemerkungen funktioniert [] genauso gut wie list(), das Semikolon ist nicht erforderlich, s1 ist ein schlechter Name für die Variable, und für range ist nur ein Parameter erforderlich, wenn Sie mit 0 beginnen.) Dann kommen Sie zu

def create_list():
    result = list()
    for i in range(10):
        result[i] = i
    return result

Dies fehlt jedoch immer noch die Markierung; range ist kein magisches Schlüsselwort, das Teil der Sprache ist, wie for und def, sondern eine Funktion. Und raten Sie mal, was diese Funktion zurückgibt? Das ist richtig - eine Liste dieser ganzen Zahlen. So bricht die gesamte Funktion zusammen 

def create_list():
    return range(10)

und jetzt sehen Sie, warum wir selbst keine Funktion schreiben müssen; range ist bereits die Funktion, nach der wir suchen. Auch wenn es keine Notwendigkeit oder keinen Grund gibt, die Liste vorabzuverlegen.

5
Karl Knechtel

Ich bin überrascht, dass niemand diesen einfachen Ansatz zum Erstellen einer Liste leerer Listen vorschlägt. Dies ist ein alter Thread, der jedoch nur der Vollständigkeit halber hinzugefügt wird. Dadurch wird eine Liste mit 10 leeren Listen erstellt

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

Zu den erstaunlichen Antworten oben hinzugefügt,

Um einfach eine leere Liste zu erstellen, die angeblich mit "Nullen" verwendet wird,

lst=[0]*size
2
faruk13

Hier ist mein Code für die 2D-Liste in Python. von Zeilen aus der Eingabe:

empty = []
row = int(input())

for i in range(row):
    temp = list(map(int, input().split()))
    empty.append(temp)

for i in empty:
    for j in i:
        print(j, end=' ')
    print('')
2
Amit Prafulla

Ich bin etwas überrascht, dass die einfachste Möglichkeit, eine initialisierte Liste zu erstellen, in keiner dieser Antworten enthalten ist. Verwenden Sie einfach einen Generator in der list-Funktion:

list(range(9))
1
Igor Rodriguez

Eine einfache Möglichkeit, eine 2D-Matrix der Größe n mithilfe von verschachtelten Listenverständnissen zu erstellen:

m = [[None for _ in range(n)] for _ in range(n)]
1
msonsona

Dieser Code generiert ein Array mit 10 Zufallszahlen. 

import random
numrand=[]
for i in range(0,10):
   a = random.randint(1,50)
   numrand.append(a)
   print(a,i)
print(numrand)
0
Akram Saeed

Ich bin auf diese SO - Frage gestoßen, als ich nach einem ähnlichen Problem suchte. Ich musste ein 2D-Array erstellen und dann einige Elemente jeder Liste (im 2D-Array) durch Elemente aus einem Diktat ersetzen. Ich kam dann über this SO - eine Frage, die mir half, vielleicht hilft dies anderen Anfängern, herumzukommen ... Der Schlüsseltrick war, das 2D-Array als numpy-Array zu initialisieren und dann Verwenden von array[i,j] anstelle von array[i][j].

Dies ist der Code, bei dem ich Folgendes verwenden musste:

nd_array = []
for i in range(30):
    nd_array.append(np.zeros(shape = (32,1)))
new_array = []
for i in range(len(lines)):
    new_array.append(nd_array)
new_array = np.asarray(new_array)
for i in range(len(lines)):
    splits = lines[i].split(' ')
    for j in range(len(splits)):
        #print(new_array[i][j])
        new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1)

Jetzt weiß ich, dass wir Listenverständnis verwenden können, aber der Einfachheit halber verwende ich eine verschachtelte for-Schleife. Hoffe, das hilft anderen, die auf diesen Beitrag stoßen.

0
Sanjay Krishna

Machen Sie es als Funktion wiederverwendbar.

def createEmptyList(length,fill=None):
    '''
    return a (empty) list of a given length
    Example:
        print createEmptyList(3,-1)
        >> [-1, -1, -1]
        print createEmptyList(4)
        >> [None, None, None, None]
    '''
    return [fill] * length
0
Kardi Teknomo