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.
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
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:
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
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.
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 3print(a*1.5)# all elements of a times 1.5print(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.
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 array „ array.array()” więc jest nieprawidłowe mylić dwóch. Listy są listami w pythonie, więc bądź ostrożny z zastosowaną nomenklaturą.
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ą.
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ę
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
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:
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
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
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.
__getitem__
razie nie byłoby O (1).Odpowiedzi:
Teraz
variable
odnosi 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
array
modułem , który oferuje typ bliższyarray
typowi C ; zawartość musi być jednorodna (wszystkie tego samego typu), ale długość jest wciąż dynamiczna.źródło
variable = ["Hi", "Hello"];
?)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życienumpy
, 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.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:
Teoretyczna odpowiedź
Pod maską Python's
list
jest opakowaniem dla prawdziwej tablicy, która zawiera odniesienia do przedmiotów. Ponadto tworzona jest podstawowa tablica z dodatkową przestrzenią.Konsekwencjami tego są:
arr[6653]
to samo coarr[0]
)append
operacja jest „za darmo”, podczas gdy jest trochę miejscainsert
operacja jest drogaSprawdź 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ą:
źródło
[1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]
wynik będzie[2, 3, 4, 5, 6, 7]
a == b[:2]
zwraca True, jeśli pierwsze 2 elementy b są równe wartościom tablicy aW rzeczywistości nie deklarujesz rzeczy, ale w ten sposób tworzysz tablicę w Pythonie:
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. :)
źródło
list
. Python ma specjalny typ danych o nazwie an,array
który jest bardziej podobny do tablicy C i jest mało używany.Myślę, że (miałeś na myśli) chcesz listę z 30 pierwszymi komórkami już wypełnionymi. Więc
Przykładem tego może być sekwencja Fibonacciego. Zobacz problem 2 w Project Euler
źródło
f = [0] * 30
zamiast tego.Oto jak:
źródło
Do obliczeń użyj tablic numpy takich jak to:
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.
źródło
Komentarz JohnMachin powinien być prawdziwą odpowiedzią. Moim zdaniem wszystkie pozostałe odpowiedzi są tylko obejściami! Więc:
źródło
x=[[0] * 10] * 10
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 bibliotekiarray
„array.array()
” więc jest nieprawidłowe mylić dwóch. Listy są listami w pythonie, więc bądź ostrożny z zastosowaną nomenklaturą.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ą.źródło
Nic nie deklarujesz w Pythonie. Po prostu go użyj. Polecam zacząć od czegoś takiego jak http://diveintopython.net .
źródło
Zazwyczaj robiłbym to,
a = [1,2,3]
co właściwie jestlist
tylkoarrays
spojrzeniem na tę formalną definicjęźródło
Aby dodać do odpowiedzi Lennarta, można utworzyć tablicę w następujący sposób:
gdzie wartości mogą przyjąć postać krotki, listy lub np.array, ale nie tablicy:
a wynik pozostanie taki sam:
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:
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:
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):
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:
lub w istocie:
podczas gdy tablica da po prostu:
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
źródło
Co powiesz na to...
źródło
Python nazywa je listami . Możesz napisać literał listy za pomocą nawiasów kwadratowych i przecinków:
źródło
Kontynuując od Lennarta, istnieje również numpy, które implementuje jednorodne tablice wielowymiarowe.
źródło
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
źródło
int count[26]={0};
Prawdopodobnie jest lepszy sposób, ale ten wariantbools
z góry zadziałałcount=[0 for ii in range(26)]
Później, a następnie zmieniłem go nacount=[0]*26
preferowany.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.
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.
źródło