Jak uzyskać pustą tablicę dowolnego rozmiaru w Pythonie?

120

Zasadniczo chcę mieć odpowiednik tego w Pythonie w C:

int a[x];

ale w Pythonie deklaruję tablicę taką jak:

a = []

a problem polega na tym, że chcę przypisać losowe gniazda z wartościami takimi jak:

a[4] = 1

ale nie mogę tego zrobić w Pythonie, ponieważ tablica jest pusta.

user299648
źródło

Odpowiedzi:

239

Jeśli przez „tablicę” masz na myśli listę w Pythonie, możesz użyć

a = [0] * 10

lub

a = [None] * 10
Sven Marnach
źródło
91
Jedną rzeczą, na którą musisz uważać, a = [obj] * Njest to, że ten sam obiekt pojawia się w każdym elemencie tablicy. Jeśli jest to zmienny obiekt i zmodyfikujesz jeden element, wszystkie zostaną zmienione. ... Ale w tym przykładzie przy użyciu liczb całkowitych (lub dowolnego innego niezmiennego typu) nie ma to znaczenia. Lub, jeśli po prostu przypisujesz elementy do elementów, nie stanowi to również problemu. (Wspominam o tym, bo robiłem to zbyt często :))
dappawit
4
To ugryzło mnie mocno w moim pierwszym projekcie w Pythonie, @dappawit. Zważ na to ostrzeżenie.
The Nate
tworzy to samo odniesienie dla obiektów
Amr Alaa
22

Nie możesz robić dokładnie tego, co chcesz w Pythonie (jeśli dobrze cię przeczytałem). Musisz podać wartości dla każdego elementu listy (lub, jak to nazwałeś, tablicy).

Ale spróbuj tego:

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

W przypadku list innych typów, użycie czegoś innego niż 0 Nonejest również dobrym wyborem.

dappawit
źródło
2
Ta odpowiedź graniczy z błędem. range(N)utworzy już listę, jeśli Python <3.0.
Apalala
1
To prawda, że ​​stworzy listę. Jeśli martwisz się o wydajność, możesz użyć xrange(N)w Pythonie 2.x. Nie jestem jednak pewien, jak to graniczy z błędem. Wolę to, a = range(N)ponieważ każdy element zaczyna się od rozsądnego „domyślnego”. Myślę, że to kwestia opinii.
dappawit
16

Możesz użyć numpy:

import numpy as np

Przykład z pustej tablicy :

np.empty([2, 2])
array([[ -9.74499359e+001,   6.69583040e-309],
       [  2.13182611e-314,   3.06959433e-309]])  
DanielTheRocketMan
źródło
7

Po prostu zadeklaruj listę i dołącz każdy element. Na przykład:

a = []
a.append('first item')
a.append('second item')
Lyle
źródło
5
Jak byś wtedy „przydzielił losowe miejsca”
Tdelang
5

możesz również rozszerzyć to za pomocą rozszerzonej metody listy.

a= []
a.extend([None]*10)
a.extend([None]*20)
Pythoni
źródło
1

Jeśli Ty (lub inni poszukiwacze tego pytania) byliście faktycznie zainteresowani utworzeniem ciągłej tablicy do wypełnienia liczbami całkowitymi, rozważ bytearray i memoryivew :

# 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
Sójka
źródło
1
x=[]
for i in range(0,5):
    x.append(i)
    print(x[i])
Akshar Patel
źródło
2
Chociaż ten kod może rozwiązać problem, w tym wyjaśnienie, jak i dlaczego to rozwiązuje problem, naprawdę pomogłoby poprawić jakość twojego posta i prawdopodobnie zaowocowałoby większą liczbą pozytywnych głosów. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a nie tylko osoba, która zapyta teraz. Proszę edytować swoje odpowiedzi, aby dodać wyjaśnień i dać wskazówkę co zastosować ograniczenia i założenia.
Daniil
0

Jeśli faktycznie chcesz mieć tablicę w stylu C.

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

Zauważ, że w Pythonie nie ma koncepcji niezainicjowanej zmiennej. Zmienna to nazwa powiązana z wartością, więc ta wartość musi coś mieć. W powyższym przykładzie tablica jest inicjowana zerami.

Jednak jest to rzadkie w Pythonie, chyba że faktycznie potrzebujesz tego do rzeczy niskiego poziomu. W większości przypadków lepiej jest użyć pustej listy lub pustej tablicy numpy, jak sugerują inne odpowiedzi.

niebieska notatka
źródło