Jak zadeklarować tablicę w Pythonie?

490

Jak zadeklarować tablicę w Pythonie ?

Nie mogę znaleźć żadnego odniesienia do tablic w dokumentacji.

Peter Mortensen
źródło
121
Z jakiegoś niezgłębionego powodu Python nazywa tablice „listami”. Szkoła projektowania języka „wszyscy-wiedzą-co-to-to-tak-nazywamy-mamy-nazwać-to-coś-innego”. Jest to szczególnie zły wybór nazwy, ponieważ wygląda raczej na połączoną listę niż tablicę.
Glenn Maynard
42
@Glenn Maynard: prawdopodobnie dlatego, że w językach podobnych do C tablice mają stałą długość, podczas gdy listy w Pythonie nie. Jest bardziej podobny do wektora STL w C ++ lub ArrayList w Javie.
MAK
128
Nazywa się to listą, ponieważ jest to lista. [A (), 1, „Foo”, u'öäöäö ”, 67L, 5.6]. Lista Tablica to „układ elementów pod równo rozmieszczonymi adresami w pamięci komputera” (wikipedia).
Lennart Regebro
35
Nic z powszechnie rozumianego terminu „tablica” nie sugeruje stałej długości ani niczego w treści; są to tylko ograniczenia konkretnej implementacji tablic w języku C. Listy w języku Python są rozmieszczone w równych odstępach (wewnętrzne wskaźniki do obiektów), w przeciwnym __getitem__razie nie byłoby O (1).
Glenn Maynard
24
@Glenn, z en.wikipedia.org/wiki/Array_data_structure: „elementy struktury danych tablicowych muszą mieć ten sam rozmiar” (prawda dla tablic Pythona, nie prawda dla list Pythona) i „zestaw prawidłowych krotek indeksu i adresy elementów (a tym samym formuła adresowania elementów) są zwykle ustalane podczas używania tablicy ”(nieprawda w Pythonie dla listy lub tablicy).
Alex Martelli,

Odpowiedzi:

358
variable = []

Teraz variableodnosi się do pustej listy * .

Oczywiście jest to zadanie, a nie deklaracja. W Pythonie nie można powiedzieć „ta zmienna nigdy nie powinna odnosić się do niczego innego niż listy”, ponieważ Python jest dynamicznie wpisywany.


* Domyślny wbudowany typ Pythona nazywa się listą , a nie tablicą. Jest to uporządkowany pojemnik o dowolnej długości, który może pomieścić heterogeniczny zbiór obiektów (ich typy nie mają znaczenia i można je dowolnie mieszać). Nie należy tego mylić z arraymodułem , który oferuje typ bliższy arraytypowi C ; zawartość musi być jednorodna (wszystkie tego samego typu), ale długość jest wciąż dynamiczna.

sepp2k
źródło
11
Czy można zainicjować zawartość tablicy, tak jak w JavaScript? (np. jako variable = ["Hi", "Hello"];?)
Anderson Green
6
@AndersonGreen Tak.
sepp2k
3
Jak więc zadeklarowałbyś tablicę wielowymiarową (np. Tablicę 2D?)
Anderson Green
7
@AndersonGreen Jak powiedziałem, w Pythonie nie ma czegoś takiego jak deklaracja zmiennej. Można by utworzyć listę wielowymiarową poprzez pustą listę i wprowadzenie innych list wewnątrz maszyny lub, jeśli wymiary liście są znane w czasie zapisu, można po prostu napisać go jako dosłowne tak: my_2x2_list = [[a, b], [c, d]]. W zależności od tego, do czego potrzebujesz tablic wielowymiarowych, możesz również rozważyć użycie numpy, które definiuje typy tablic dla wielowymiarowych, jednorodnych, nieopakowanych tablic, które mogą być znacznie bardziej wydajne tam, gdzie ma to zastosowanie, więc są one preferowane do obliczeń numerycznych.
sepp2k
1
@IfanIqbal Tak, jeśli zawiera co najmniej jeden element, możesz.
sepp2k
136

Jest to zaskakująco złożony temat w Pythonie.

Praktyczna odpowiedź

Tablice są reprezentowane przez klasy list(patrz odnośnik i nie mieszaj ich z generatorami ).

Sprawdź przykłady użycia:

# 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)

Teoretyczna odpowiedź

Pod maską Python's listjest opakowaniem dla prawdziwej tablicy, która zawiera odniesienia do przedmiotów. Ponadto tworzona jest podstawowa tablica z dodatkową przestrzenią.

Konsekwencjami tego są:

  • losowy dostęp jest naprawdę tani ( arr[6653]to samo co arr[0])
  • append operacja jest „za darmo”, podczas gdy jest trochę miejsca
  • insert operacja jest droga

Sprawdź tę niesamowitą złożoność operacji .

Zobacz także to zdjęcie, na którym próbowałem pokazać najważniejsze różnice między tablicą, tablicą referencji i połączoną listą: tablice, tablice wszędzie

Anton Purin
źródło
5
Wystarczy dodać, że jest naprawdę fajny sposób na wycinanie tablic w pythonie: [1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]wynik będzie[2, 3, 4, 5, 6, 7]
Anton Purin
2
Od czasu do czasu widzę głosy negatywne za ten post. Byłoby wspaniale, gdyby ktoś mógł zamieścić słowo dlaczego. Dzięki.
Anton Purin
2
Jesteś prawdziwym MVP. Musisz znać aktualnie wybrany projekt „listy”, aby podejmować rozsądne decyzje dotyczące programowania. Zasadniczo jest to jak „wektor” w C ++. Dzięki!
Necro,
To naprawdę długa odpowiedź z doskonałym wyjaśnieniem!
Ahmed
Czy mogę dodać praktyczną notację do porównania, na przykład: a == b[:2]zwraca True, jeśli pierwsze 2 elementy b są równe wartościom tablicy a
Bruno L.
124

W rzeczywistości nie deklarujesz rzeczy, ale w ten sposób tworzysz tablicę w Pythonie:

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

Aby uzyskać więcej informacji, zobacz moduł macierzy: http://docs.python.org/library/array.html

Możliwe, że nie chcesz tablicy, ale listy, ale inni już na to odpowiedzieli. :)

Lennart Regebro
źródło
10
To trochę zabawna, ale niezbyt dobra odpowiedź na pytanie oznaczone jako „początkujący”. Żeby było jasne: w Pythonie zwykle używasz typu danych o nazwie a list. Python ma specjalny typ danych o nazwie an, arrayktóry jest bardziej podobny do tablicy C i jest mało używany.
steveha
63
Nie, ale wszyscy inni już skorzystali z listy. Pomyślałem, że dobrą odpowiedzią byłoby wskazanie, że istnieją również tablice.
Lennart Regebro
8
super szalone rekwizyty dla tej odpowiedzi. Programuję w Pythonie od lat i dopiero niedawno zdałem sobie sprawę, że istnieje rzeczywisty obiekt tablicy Python, który różni się od obiektów listy. Podczas gdy struktura danych jest bardzo podobna, tablice ograniczają rodzaj obiektów, które tablica może pomieścić. Świetna odpowiedź @ LennartRegebro!
Josh Brown
4
To powinna być właściwa odpowiedź Lista i tablice to dwie różne rzeczy @LennartRegebro dzięki
Mina Gabriel
Istnieje konkretny powód, dla którego możesz chcieć używać tablic zamiast list. W szczególności, jeśli masz tablicę o nazwie myarray pełną liczb, możesz wykonywać na niej operacje matematyczne, a te operacje są stosowane do wszystkich elementów w niej zawartych. Tak więc, jeśli wykonasz myarray / 3, każda liczba w środku zostanie podzielona przez 3. Jeśli spróbujesz zrobić to samo z listą, otrzymasz błąd. Tak więc tablice są bardziej wydajne dla dużych zestawów danych liczb.
Matthew
66

Myślę, że (miałeś na myśli) chcesz listę z 30 pierwszymi komórkami już wypełnionymi. Więc

   f = []

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

Przykładem tego może być sekwencja Fibonacciego. Zobacz problem 2 w Project Euler

krakers
źródło
96
To raczej barokowy sposób inicjowania listy. Spróbuj f = [0] * 30zamiast tego.
John Machin,
Czy to nie to samo, co a = zakres (10) z @slehar anwer? Uwielbiam pytona, jego składnia i to Zen.
m3nda
@ erm3nda nope: $ python3 Python 3.4.2 [...] >>> a = zakres (10) >>> drukuj (a) zakres (0, 10) >>>
arp
37

Oto jak:

my_array = [1, 'rebecca', 'allard', 15]
kanadyjski
źródło
4
Ponieważ nie jest to tablica python, ale lista python, czy nie byłoby mniej mylące nazywanie jej „my_list”?
Mattis Asp
4
To tworzy listę, a nie tablicę. Są różne i mają różne właściwości w Pythonie. W szczególności możesz wykonywać operacje numeryczne na tablicy, ale nie na liście.
Matthew
21

Do obliczeń użyj tablic numpy takich jak to:

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

te tablice numpy mogą być zapisywane i ładowane z dysku (nawet skompresowane), a złożone obliczenia z dużą ilością elementów są szybko podobne do C.

Często stosowany w środowiskach naukowych. Zobacz tutaj po więcej.

Remi
źródło
17

Komentarz JohnMachin powinien być prawdziwą odpowiedzią. Moim zdaniem wszystkie pozostałe odpowiedzi są tylko obejściami! Więc:

array=[0]*element_count
csabinho
źródło
Zgodzić się. z wyjątkiem ostrożnego nazywania nawet zmiennej „tablica” lub uzyskania purystycznego gniewu. do tego dodałbym również, że podobnie można tworzyć „tablice wielowymiarowe”:x=[[0] * 10] * 10
Peter S Magnusson
17

Kilka wypowiedzi sugerowało, że tablice w pythonie są reprezentowane przez listy. To jest niepoprawne. Python posiada niezależne wdrożenia array()w standardowym module biblioteki arrayarray.array()” więc jest nieprawidłowe mylić dwóch. Listy są listami w pythonie, więc bądź ostrożny z zastosowaną nomenklaturą.

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

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

Jest jedna bardzo ważna różnica między listą a array.array(). Podczas gdy oba te obiekty są sekwencjami uporządkowanymi, array.array () jest uporządkowanymi sekwencjami homogenicznymi, podczas gdy lista jest sekwencją niejednorodną.

hususs
źródło
16

Nic nie deklarujesz w Pythonie. Po prostu go użyj. Polecam zacząć od czegoś takiego jak http://diveintopython.net .

Bayer
źródło
2
Czasami musisz zadeklarować typ zmiennej: jeśli nie użyjesz jej wcześniej, struktura kontrolna, nie istnieje ona poza strukturą kontrolną, a następnie będziesz budować nową zmienną. Zakłada się zatem, że zmienna jest liczbą całkowitą, która koliduje, jeśli użyjesz jej jako bardziej złożonego typu.
Jaśniejsze
@ Czystsze tak, używanie funkcji czasami musi to deklarować, a czasem odtwarzanie niektórych globali podczas używania funkcji i nie chcę pisać zbyt wielu argumentów na temat funkcji.
m3nda
To nie tylko funkcja; prosta instrukcja if może dać ci ten sam problem.
Jaśniejsze
1
Programowanie polega na deklarowaniu, bez względu na to, jakiego języka używasz.
Deklaracja
Chociaż ten link może odpowiedzieć na pytanie, lepiej dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
Adrian Tompkins,
13

Zazwyczaj robiłbym to, a = [1,2,3]co właściwie jest listtylko arraysspojrzeniem na tę formalną definicję

niesekwencyjny
źródło
11

Aby dodać do odpowiedzi Lennarta, można utworzyć tablicę w następujący sposób:

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

gdzie wartości mogą przyjąć postać krotki, listy lub np.array, ale nie tablicy:

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

a wynik pozostanie taki sam:

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

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

Większość metod list działa również z tablicą, najczęściej są to pop (), ext () i append ().

Sądząc z odpowiedzi i komentarzy, wydaje się, że struktura danych tablicowych nie jest tak popularna. Podoba mi się to tak samo, jak ktoś wolałby krotkę niż listę.

Struktura tablicy ma bardziej rygorystyczne reguły niż lista lub tablica np., Co może zmniejszyć liczbę błędów i ułatwić debugowanie, szczególnie podczas pracy z danymi numerycznymi.

Próby wstawienia / dołączenia liczby zmiennoprzecinkowej do tablicy int spowodują błąd TypeError:

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

Zachowanie wartości, które mają być liczbami całkowitymi (np. Lista indeksów) w formie tablicy, może zatem zapobiec „Typowi błędu: indeksy list muszą być liczbami całkowitymi, a nie zmiennoprzecinkowymi”, ponieważ tablice można iterować, podobnie jak np. Tablica i listy:

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

Irytujące dodanie int do tablicy zmiennoprzecinkowej spowoduje, że int stanie się zmiennoprzecinkową, bez zgłaszania wyjątku.

np.array zachowuje również ten sam typ danych dla swoich wpisów, ale zamiast dawać błąd, zmieni typ danych, aby pasował do nowych wpisów (zwykle podwoić lub 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

Dotyczy to również zadania. Jeśli zostanie określony typ danych, np.array, w miarę możliwości, przekształci wpisy do tego typu danych:

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_'>

lub w istocie:

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

podczas gdy tablica da po prostu:

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

Z tego powodu nie warto używać np.array do poleceń specyficznych dla typu. Przydaje się tutaj struktura tablic. lista zachowuje typ danych wartości.

A dla czegoś uważam raczej za nieznośne: typ danych jest określony jako pierwszy argument w tablicy (), ale (zwykle) drugi w np.array (). : |

Relacja do C jest przywołana tutaj: Python List vs. Array - kiedy używać?

Miłej zabawy podczas odkrywania!

Uwaga: Typowa i raczej ścisła natura tablicy bardziej opiera się na C niż na Pythonie, a z założenia Python nie ma wielu specyficznych dla typu ograniczeń w swoich funkcjach. Jego niepopularność powoduje również pozytywne opinie we współpracy, a zastąpienie go wiąże się głównie z dodatkowym [int (x) dla x w pliku]. Dlatego ignorowanie istnienia tablicy jest całkowicie wykonalne i rozsądne. Nie powinno to w żaden sposób utrudniać większości z nas. :RE

Melvin
źródło
8

Co powiesz na to...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6
Slehar
źródło
6

Python nazywa je listami . Możesz napisać literał listy za pomocą nawiasów kwadratowych i przecinków:

>>> [6,28,496,8128]
[6, 28, 496, 8128]
Pułkownik Panika
źródło
5

Kontynuując od Lennarta, istnieje również numpy, które implementuje jednorodne tablice wielowymiarowe.

camh
źródło
4

Miałem tablicę ciągów i potrzebowałem tablicy o tej samej długości booleanów zainicjowanych na True. Oto co zrobiłem

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]
Pedro A. Aranda
źródło
Jestem tutaj, ponieważ chciałem deklaracji C: int count[26]={0}; Prawdopodobnie jest lepszy sposób, ale ten wariant boolsz góry zadziałał count=[0 for ii in range(26)]Później, a następnie zmieniłem go na count=[0]*26preferowany.
user1683793,
2

Możesz tworzyć listy i konwertować je na tablice lub tworzyć tablice za pomocą modułu numpy. Poniżej kilka przykładów ilustrujących to samo. Numpy ułatwia także pracę z tablicami wielowymiarowymi.

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

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

Możesz także przekształcić tę tablicę w macierz 2X2, używając funkcji zmiany kształtu, która pobiera dane wejściowe jako wymiary macierzy.

mat = a.reshape(2, 2)
Amit Prafulla
źródło