Wie deklariere ich ein Array in Python?

490

Wie deklariere ich ein Array in Python ?

Ich kann in der Dokumentation keinen Verweis auf Arrays finden.

Peter Mortensen
quelle
121
Aus irgendeinem unergründlichen Grund nennt Python Arrays "Listen". Die Schule für Sprachdesign "Jeder weiß, wie das heißt, also werden wir es etwas anderes nennen". Es ist eine besonders schlechte Wahl des Namens, da es eher wie eine verknüpfte Liste als wie ein Array aussieht.
Glenn Maynard
42
@Glenn Maynard: Wahrscheinlich, weil in C-ähnlichen Sprachen Arrays eine feste Länge haben, Python-Listen jedoch nicht. Es ist eher wie ein STL-Vektor in C ++ oder eine ArrayList in Java.
MAK
128
Es heißt Liste, weil es eine Liste ist. [A (), 1, 'Foo', u'öäöäö ', 67L, 5.6]. Eine Liste. Ein Array ist "eine Anordnung von Elementen an Adressen mit gleichem Abstand im Computerspeicher" (Wikipedia).
Lennart Regebro
35
Nichts über den allgemein verständlichen Begriff "Array" deutet auf eine feste Länge oder irgendetwas über den Inhalt hin; Dies sind nur Einschränkungen der speziellen Implementierung von Arrays durch C. Python-Listen haben den gleichen Abstand (Zeiger auf Objekte, intern) oder __getitem__wären sonst nicht O (1).
Glenn Maynard
24
@Glenn, aus en.wikipedia.org/wiki/Array_data_structure: "Die Elemente einer Array-Datenstruktur müssen dieselbe Größe haben" (wahr für Pythons Arrays, nicht wahr für Python-Listen) und "Satz gültiger Indextupel und Die Adressen der Elemente (und damit die Elementadressierungsformel) werden normalerweise festgelegt, während das Array verwendet wird "(in Python weder für die Liste noch für das Array zutreffend).
Alex Martelli

Antworten:

358
variable = []

Nun variablebezieht sich auf eine leere Liste * .

Dies ist natürlich eine Aufgabe, keine Erklärung. In Python gibt es keine Möglichkeit zu sagen, "diese Variable sollte niemals auf etwas anderes als eine Liste verweisen", da Python dynamisch typisiert wird.


* Der standardmäßig integrierte Python-Typ wird als Liste und nicht als Array bezeichnet. Es ist ein geordneter Container beliebiger Länge, der eine heterogene Sammlung von Objekten aufnehmen kann (ihre Typen spielen keine Rolle und können frei gemischt werden). Dies sollte nicht mit dem arrayModul verwechselt werden , das einen Typ bietet, der dem C- arrayTyp näher kommt . Der Inhalt muss homogen sein (alle vom gleichen Typ), aber die Länge ist immer noch dynamisch.

sepp2k
quelle
11
Wäre es möglich, den Inhalt des Arrays wie in JavaScript zu initialisieren? (zB als variable = ["Hi", "Hello"];?)
Anderson Green
6
@ AndersonGreen Ja.
sepp2k
3
Wie würden Sie dann ein mehrdimensionales Array deklarieren (z. B. ein 2D-Array?)
Anderson Green
7
@AndersonGreen Wie gesagt, es gibt in Python keine Variablendeklaration. Sie würden eine mehrdimensionale Liste erstellen, indem Sie eine leere Liste nehmen und andere Listen darin einfügen. Wenn die Dimensionen der Liste zum Zeitpunkt des Schreibens bekannt sind, können Sie sie einfach als Literal wie folgt schreiben : my_2x2_list = [[a, b], [c, d]]. Abhängig davon, wofür Sie mehrdimensionale Arrays benötigen, können Sie auch die Verwendung in Betracht ziehen numpy, die Array-Typen für mehrdimensionale, homogene Arrays ohne Box definiert, die gegebenenfalls viel effizienter sein können. Daher sind sie für numerische Berechnungen vorzuziehen.
sepp2k
1
@IfanIqbal Ja, wenn es mindestens ein Element enthält, können Sie.
sepp2k
136

Dies ist ein überraschend komplexes Thema in Python.

Praktische Antwort

Arrays werden nach Klassen dargestellt list(siehe Referenz und nicht mit Generatoren mischen ).

Schauen Sie sich Verwendungsbeispiele an:

# empty array
arr = [] 

# init with values (can contain mixed types)
arr = [1, "eels"]

# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0]  # 1
arr[-1] # 6

# get length
length = len(arr)

# supports append and insert
arr.append(8)
arr.insert(6, 7)

Theoretische Antwort

Unter der Haube Python's listist ein Wrapper für ein echtes Array, das Verweise auf Elemente enthält. Außerdem wird das zugrunde liegende Array mit zusätzlichem Speicherplatz erstellt.

Folgen davon sind:

  • Direktzugriff ist wirklich billig ( arr[6653]ist das gleiche zu arr[0])
  • append Der Betrieb ist "kostenlos", während etwas mehr Platz zur Verfügung steht
  • insert Betrieb ist teuer

Überprüfen Sie diese beeindruckende Tabelle der Komplexität der Operationen .

Sehen Sie sich auch dieses Bild an, in dem ich versucht habe, die wichtigsten Unterschiede zwischen Array, Array von Referenzen und verknüpfter Liste aufzuzeigen: Arrays, Arrays überall

Anton Purin
quelle
5
Nur um hinzuzufügen, es gibt eine wirklich coole Möglichkeit, Arrays in Python zu schneiden: Das [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]Ergebnis wird sein[2, 3, 4, 5, 6, 7]
Anton Purin
2
Ich sehe von Zeit zu Zeit einige Abstimmungen für diesen Beitrag. Es wäre großartig, wenn jemand ein Wort posten könnte, warum. Vielen Dank.
Anton Purin
2
Du bist ein echter MVP. Sie müssen das tatsächlich gewählte Design der 'Liste' kennen, um vernünftige Programmierentscheidungen treffen zu können. Im Grunde ist es wie ein 'Vektor' in C ++. Vielen Dank!
Necro
Dies ist eine sehr lange Antwort mit einer großartigen Erklärung!
Ahmed
Darf ich zum Vergleich die praktische Notation hinzufügen: a == b[:2]Gibt True zurück, wenn die ersten beiden Elemente von b den Werten von Array a entsprechen
Bruno L.
124

Sie deklarieren eigentlich keine Dinge, aber so erstellen Sie ein Array in Python:

from array import array
intarray = array('i')

Weitere Informationen finden Sie im Array-Modul: http://docs.python.org/library/array.html

Jetzt möchten Sie vielleicht kein Array, sondern eine Liste, aber andere haben das bereits beantwortet. :) :)

Lennart Regebro
quelle
10
Dies ist irgendwie lustig, aber keine wirklich gute Antwort auf eine Frage mit dem Tag "Anfänger". Nur um es klar zu machen: In Python verwenden Sie normalerweise einen Datentyp namens a list. Python hat einen speziellen Datentyp namens an, arrayder eher einem C-Array ähnelt und wenig verwendet wird.
Steveha
63
Nein, aber alle anderen haben bereits eine Liste verwendet. Ich dachte, es wäre eine gute Antwort, darauf hinzuweisen, dass es auch Arrays gibt.
Lennart Regebro
8
super verrückte Requisiten für diese Antwort. Ich habe jahrelang in Python programmiert und erst kürzlich festgestellt, dass es ein tatsächliches Python-Array-Objekt gibt, das sich von Listenobjekten unterscheidet. Während die Datenstruktur sehr ähnlich ist, begrenzen Arrays, welche Art von Objekten das Array enthalten kann. Tolle Antwort @LennartRegebro!
Josh Brown
4
Dies sollte die richtige Antwort sein Liste und Arrays sind zwei verschiedene Dinge @LennartRegebro danke
Mina Gabriel
Es gibt einen bestimmten Grund, warum Sie möglicherweise Arrays anstelle von Listen verwenden möchten. Insbesondere wenn Sie ein Array namens myarray voller Zahlen haben, können Sie mathematische Operationen dagegen ausführen, und diese Operationen werden auf alle darin enthaltenen Elemente angewendet. Wenn Sie also myarray / 3 ausführen, wird jede Zahl im Inneren durch 3 geteilt. Wenn Sie versuchen, dasselbe mit einer Liste zu tun, wird eine Fehlermeldung angezeigt. Arrays sind daher für große Datenmengen effizienter.
Matthew
66

Ich denke, Sie möchten eine Liste mit den ersten 30 bereits gefüllten Zellen. Damit

   f = []

   for i in range(30):
       f.append(0)

Ein Beispiel dafür, wo dies verwendet werden könnte, ist die Fibonacci-Sequenz. Siehe Problem 2 in Project Euler

Limitcracker
quelle
96
Das ist eine ziemlich barocke Art, eine Liste zu initialisieren. Versuchen Sie es f = [0] * 30stattdessen.
John Machin
Ist nicht dasselbe wie a = Bereich (10) von @slehar anwer? Liebe Python, es ist Syntax und es ist Zen.
m3nda
@ erm3nda nein: $ python3 Python 3.4.2 [...] >>> a = Bereich (10) >>>
drucke
37

Das ist wie:

my_array = [1, 'rebecca', 'allard', 15]
kanadisch
quelle
4
Da dies kein Python-Array, sondern eine Python-Liste ist, wäre es nicht weniger verwirrend, sie "my_list" zu nennen?
Mattis Asp
4
Dadurch wird eine Liste erstellt, kein Array. Sie sind unterschiedlich und haben unterschiedliche Eigenschaften in Python. Insbesondere können Sie numerische Operationen für ein Array ausführen, jedoch nicht für eine Liste.
Matthew
21

Verwenden Sie für Berechnungen Numpy- Arrays wie folgt :

import numpy as np

a = np.ones((3,2))        # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3])     # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100)  # an array with 100 points beteen (and including) 2 and 3

print(a*1.5)  # all elements of a times 1.5
print(a.T+b)  # b added to the transpose of a

Diese Numpy-Arrays können gespeichert und von der Festplatte geladen (sogar komprimiert) werden, und komplexe Berechnungen mit großen Mengen an Elementen sind C-ähnlich schnell.

Viel verwendet in wissenschaftlichen Umgebungen. Weitere Informationen finden Sie hier .

Remi
quelle
17

JohnMachins Kommentar sollte die wahre Antwort sein. Alle anderen Antworten sind meiner Meinung nach nur Problemumgehungen! Damit:

array=[0]*element_count
csabinho
quelle
zustimmen. außer darauf zu achten, auch nur die Variable "Array" zu nennen oder puristischen Zorn zu bekommen. Dazu möchte ich noch hinzufügen, dass Sie auf ähnliche Weise "mehrdimensionale Arrays" erstellen können:x=[[0] * 10] * 10
Peter S Magnusson
17

Einige Beiträge deuteten darauf hin, dass Arrays in Python durch Listen dargestellt werden. Das ist falsch. Python hat eine unabhängige Implementierung array()im Standardbibliotheksmodul array " array.array()", daher ist es falsch, die beiden zu verwechseln. Listen sind Listen in Python. Gehen Sie daher vorsichtig mit der verwendeten Nomenklatur um.

list_01 = [4, 6.2, 7-2j, 'flo', 'cro']

list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']

Es gibt einen sehr wichtigen Unterschied zwischen Liste und array.array(). Während diese beiden Objekte geordnete Sequenzen sind, ist array.array () eine geordnete homogene Sequenz, während eine Liste eine inhomogene Sequenz ist.

Hussam
quelle
16

Sie deklarieren nichts in Python. Du benutzt es einfach. Ich empfehle Ihnen, mit etwas wie http://diveintopython.net zu beginnen .

Bayer
quelle
2
Manchmal müssen Sie den Typ einer Variablen deklarieren: Wenn Sie sie zuvor nicht verwenden, eine Kontrollstruktur, existiert sie nicht außerhalb der Kontrollstruktur, und Sie erstellen dann eine neue Variable. Die Annahme ist dann, dass die Variable ein int ist, was zusammenstößt, wenn Sie sie als komplexeren Typ verwenden.
Klarer
@Clearer Ja, die Verwendung von Funktionen muss manchmal deklariert werden, und manchmal müssen einige Globals gespielt werden, wenn Funktionen verwendet werden, und ich möchte nicht zu viele Argumente für Funktionen schreiben.
m3nda
Es ist nicht nur Funktion; Eine einfache if-Anweisung könnte Ihnen das gleiche Problem bereiten.
Klarer
1
Beim Programmieren geht es darum zu deklarieren, egal welche Sprache Sie verwenden. Typ deklarieren ist eine ganz andere Geschichte
Outside_Box
Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.
Adrian Tompkins
13

Normalerweise würde ich nur tun , a = [1,2,3]was ist eigentlich ein , listaber für arraysBlick auf dieser formalen Definition

kein Sequitor
quelle
11

Um Lennarts Antwort zu ergänzen, kann ein Array wie folgt erstellt werden:

from array import array
float_array = array("f",values)

Dabei können Werte die Form eines Tupels, einer Liste oder eines np.array haben, jedoch kein Array:

values = [1,2,3]
values = (1,2,3)
values = np.array([1,2,3],'f')
# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])
# TypeError: 'array.array' object is not callable

und die Ausgabe bleibt unverändert:

print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))

# array('f', [1.0, 2.0, 3.0])
# 2.0
# True

Die meisten Methoden für Listen funktionieren auch mit Arrays. Die häufigsten Methoden sind pop (), expand () und append ().

Den Antworten und Kommentaren nach zu urteilen, scheint die Array-Datenstruktur nicht so beliebt zu sein. Ich mag es aber genauso, wie man ein Tupel einer Liste vorziehen könnte.

Die Array-Struktur hat strengere Regeln als eine Liste oder ein np.array. Dies kann Fehler reduzieren und das Debuggen erleichtern, insbesondere wenn mit numerischen Daten gearbeitet wird.

Versuche, ein Float in ein int-Array einzufügen / anzuhängen, lösen einen TypeError aus:

values = [1,2,3]
int_array = array("i",values)
int_array.append(float(1))
# or int_array.extend([float(1)])

# TypeError: integer argument expected, got float

Das Beibehalten von Werten, die als Ganzzahlen gedacht sind (z. B. Liste von Indizes) in der Array-Form, kann daher einen "TypeError: Listenindizes müssen Ganzzahlen sein, nicht Float", da Arrays ähnlich wie np.array und Listen iteriert werden können:

int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
    sample.append(data[i])

Ärgerlicherweise führt das Anhängen eines Int an ein Float-Array dazu, dass das Int zu einem Float wird, ohne eine Ausnahme auszulösen.

np.array behält den gleichen Datentyp auch für seine Einträge bei, gibt jedoch anstelle eines Fehlers seinen Datentyp an neue Einträge an (normalerweise in double oder str):

import numpy as np
numpy_int_array = np.array([1,2,3],'i')
for i in numpy_int_array:
    print(type(i))
    # <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))
# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))
# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")
# <class 'numpy.str_'> for all values
data = [11,22,33,44,55]
sample = []
for i in numpy_int_array_2:
    sample.append(data[i])
    # no problem here, but TypeError for the other two

Dies gilt auch während der Zuordnung. Wenn der Datentyp angegeben ist, wandelt np.array die Einträge nach Möglichkeit in diesen Datentyp um:

int_numpy_array = np.array([1,2,float(3)],'i')
# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')
# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')
# ValueError: invalid literal for int() with base 10: 'string'
# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')
print(str_numpy_array)
print([type(i) for i in str_numpy_array])
# ['1' '2' '3']
# <class 'numpy.str_'>

oder im Wesentlichen:

data = [1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 = [int(i) for i in data]
print(list_1 == list_2)
# True

während Array einfach geben wird:

invalid_array = array([1,2,3.9],'i')
# TypeError: integer argument expected, got float

Aus diesem Grund ist es keine gute Idee, np.array für typspezifische Befehle zu verwenden. Die Array-Struktur ist hier nützlich. list behält den Datentyp der Werte bei.

Und für etwas, das ich ziemlich nervig finde: Der Datentyp wird als erstes Argument in array () angegeben, aber (normalerweise) als zweites in np.array (). : |

Auf die Beziehung zu C wird hier Bezug genommen: Python-Liste vs. Array - wann verwenden?

Viel Spaß beim Erkunden!

Hinweis: Die typisierte und ziemlich strenge Natur des Arrays tendiert eher zu C als zu Python, und Python hat von Natur aus nicht viele typspezifische Einschränkungen in seinen Funktionen. Seine Unbeliebtheit erzeugt auch ein positives Feedback in der Zusammenarbeit, und das Ersetzen beinhaltet meistens ein zusätzliches [int (x) für x in Datei]. Es ist daher durchaus sinnvoll und vernünftig, die Existenz eines Arrays zu ignorieren. Es sollte die meisten von uns in keiner Weise behindern. : D.

Melvin
quelle
8

Wie wäre es damit...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
Slehar
quelle
6

Python nennt sie Listen . Sie können ein Listenliteral mit eckigen Klammern und Kommas schreiben:

>>> [6,28,496,8128]
[6, 28, 496, 8128]
Oberst Panik
quelle
5

Nach Lennart gibt es auch Numpy, das homogene mehrdimensionale Arrays implementiert.

camh
quelle
4

Ich hatte ein Array von Strings und brauchte ein Array mit der gleichen Länge von Booleschen Werten, die für True initiiert wurden. Das habe ich getan

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]
Pedro A. Aranda
quelle
Ich bin hier, weil ich die C-Erklärung wollte: int count[26]={0}; Es gibt wahrscheinlich einen besseren Weg, aber diese Variante boolsvon oben hat funktioniert. count=[0 for ii in range(26)]Später habe ich sie dann geändert, count=[0]*26was vorzuziehen scheint.
user1683793
2

Sie können Listen erstellen und in Arrays konvertieren oder mit dem numpy-Modul ein Array erstellen. Im Folgenden finden Sie einige Beispiele, um dies zu veranschaulichen. Numpy erleichtert auch das Arbeiten mit mehrdimensionalen Arrays.

import numpy as np
a = np.array([1, 2, 3, 4])

#For custom inputs
a = np.array([int(x) for x in input().split()])

Sie können dieses Array auch mithilfe der Umformungsfunktion, die Eingaben als Abmessungen der Matrix verwendet, in eine 2X2-Matrix umformen.

mat = a.reshape(2, 2)
Amit Prafulla
quelle