Wie erhalte ich in Python ein leeres Array beliebiger Größe?


120

Ich möchte im Grunde ein Python-Äquivalent dazu in C:

int a[x];

aber in Python deklariere ich ein Array wie:

a = []

und das Problem ist, dass ich zufällige Slots mit Werten wie den folgenden zuweisen möchte:

a[4] = 1

Aber ich kann das nicht mit Python machen, da das Array leer ist.

Antworten:


239

Wenn Sie mit "Array" tatsächlich eine Python-Liste meinen, können Sie diese verwenden

a = [0] * 10

oder

a = [None] * 10

91
Eine Sache, auf die Sie a = [obj] * Nachten müssen, ist, dass in jedem Element des Arrays dasselbe Objekt angezeigt wird. Wenn es sich um ein veränderbares Objekt handelt und Sie ein Element ändern, werden alle geändert. ... Für dieses Beispiel mit Ganzzahlen (oder einem anderen unveränderlichen Typ) spielt dies jedoch keine Rolle. Wenn Sie nur Elemente zuweisen, ist dies ebenfalls kein Problem. (Ich erwähne es, weil ich genau das viel zu oft getan habe :))
dappawit

4
Dass ich gebissen hart auf meinem ersten Python - Projekt, @dappawit. Beachten Sie diese Warnung.
The Nate

es erstellt die gleiche Referenz für Objekte
Amr Alaa

22

Sie können in Python nicht genau das tun, was Sie wollen (wenn ich Sie richtig gelesen habe). Sie müssen Werte für jedes Element der Liste (oder wie Sie es nannten, Array) eingeben.

Aber versuchen Sie Folgendes:

a = [0 for x in range(N)]  # N = size of list you want
a[i] = 5  # as long as i < N, you're okay

Verwenden Sie für Listen anderer Typen Nonehäufig etwas anderes als 0. Dies ist häufig auch eine gute Wahl.


2
Diese Antwort grenzt an das Falsche. range(N)wird bereits eine Liste erstellen, wenn Python <3.0.
Apalala

1
Richtig, es wird eine Liste erstellt. Wenn Sie sich Sorgen um die Effizienz machen, können Sie xrange(N)Python 2.x verwenden. Ich bin mir jedoch nicht sicher, wie es an das Falsche grenzt. Ich bevorzuge es, a = range(N)weil jedes Element mit einem vernünftigen "Standard" beginnt. Ich denke, es ist Ansichtssache.
Dappawit

16

Sie können numpy verwenden:

import numpy as np

Beispiel aus leerem Array :

np.empty([2, 2])
array([[ -9.74499359e+001,   6.69583040e-309],
       [  2.13182611e-314,   3.06959433e-309]])  

7

Deklarieren Sie einfach die Liste und hängen Sie jedes Element an. Zum Beispiel:

a = []
a.append('first item')
a.append('second item')

5
Wie würden Sie dann "zufällige Slots zuweisen"
Tdelang

5

Sie können dies auch mit der Methode zum Erweitern der Liste erweitern.

a= []
a.extend([None]*10)
a.extend([None]*20)

1

Wenn Sie (oder andere Sucher dieser Frage) tatsächlich daran interessiert waren, ein zusammenhängendes Array zum Füllen mit ganzen Zahlen zu erstellen , ziehen Sie bytearray und memoryivew in Betracht :

# cast() is available starting Python 3.3
size = 10**6 
ints = memoryview(bytearray(size)).cast('i') 

ints.contiguous, ints.itemsize, ints.shape
# (True, 4, (250000,))

ints[0]
# 0

ints[0] = 16
ints[0]
# 16

1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])

2
Während dieser Code die Frage lösen kann, einschließlich einer Erklärung, wie und warum dies das Problem löst, würde dies wirklich dazu beitragen, die Qualität Ihres Beitrags zu verbessern, und wahrscheinlich zu mehr Up-Votes führen. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt. Bitte bearbeiten Sie Ihre Antwort, um Erklärungen hinzuzufügen und anzugeben, welche Einschränkungen und Annahmen gelten.
Daniil

0

Wenn Sie tatsächlich ein Array im C-Stil möchten

import array
a = array.array('i', x * [0])
a[3] = 5
try:
   [5] = 'a'
except TypeError:
   print('integers only allowed')

Beachten Sie, dass es in Python kein Konzept für nicht initialisierte Variablen gibt. Eine Variable ist ein Name, der an einen Wert gebunden ist, sodass dieser Wert etwas haben muss. Im obigen Beispiel wird das Array mit Nullen initialisiert.

Dies ist jedoch in Python ungewöhnlich, es sei denn, Sie benötigen es tatsächlich für Low-Level-Inhalte. In den meisten Fällen ist es besser, eine leere Liste oder ein leeres Numpy-Array zu verwenden, wie andere Antworten vermuten lassen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.