2012-05-23 15 views
239

Chcę utworzyć pustą listę (lub jakikolwiek jest najlepszy sposób), która może pomieścić 10 elementów.Utwórz pustą listę w pythonie o określonym rozmiarze

Potem chcesz przypisać wartości z tej listy, na przykład to ma wyświetlać 0 do 9:

s1 = list(); 
for i in range(0,9): 
    s1[i] = i 

print s1 

Ale kiedy uruchomić ten kod, to generuje błąd lub w innym przypadku po prostu wyświetla [] (pusty).

Czy ktoś może wyjaśnić, dlaczego?

+0

dlaczego trzeba utworzyć pustą listę? –

+0

możliwy duplikat [Inicjowanie listy do znanej liczby elementów w Pythonie] (http://stackoverflow.com/questions/521674/initializing-a-list-to-a-known-number-ofements-in- python) – lumbric

+4

"Pusta lista" ('[]') z definicji ma zero elementów. To, czego najwyraźniej chcesz, to lista wartości fałszujących, takich jak 'None',' 0' lub ''''. – dan04

Odpowiedz

404

nie można przypisać do listy jak lst[i] = something. Musisz użyć append. lst.append(something).

(Możesz użyć notacji przydziału, jeśli korzystasz ze słownika).

utworzenie pustej listy:

>>> l = [None] * 10 
>>> l 
[None, None, None, None, None, None, None, None, None, None] 

zakres (X) tworzy listę od [0, 1, 2, ... X-1]

# 2.X only. Use list(range(10)) in 3.X. 
>>> l = range(10) 
>>> l 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

wykorzystując funkcję tworzyć lista:

>>> def display(): 
...  s1 = [] 
...  for i in range(9): # This is just to tell you how to create a list. 
...   s1.append(i) 
...  return s1 
... 
>>> print display() 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 

Lista rozumienie (za pomocą kwadratów bo zakresie nie trzeba robić to wszystko, można po prostu wrócić range(0,9)):

>>> def display(): 
...  return [x**2 for x in range(9)] 
... 
>>> print display() 
[0, 1, 4, 9, 16, 25, 36, 49, 64] 
16

Możesz dodać do listy: .append(element), np .: s1.append(i). Obecnie próbujesz uzyskać dostęp do elementu (s1[i]), który nie istnieje.

69

Spróbuj zamiast:

lst = [None] * 10 

Powyższy tworzy listę rozmiarze 10, gdzie każda pozycja jest inicjowany do None. Następnie możesz dodać do niego elementy:

lst = [None] * 10 
for i in range(10): 
    lst[i] = i 

Oczywiście nie jest to Pythoniczny sposób robienia rzeczy. Lepiej to zrobić:

lst = [] 
for i in range(10): 
    lst.append(i) 

Albo nawet lepsze, lista użycie Ułatwienia takie jak ten:

[i for i in range(10)] 
+0

Inną wspaniałą rzeczą jest to, że możesz zainicjować listę z wartościami domyślnymi. 'lst = [''] * 10' lub' lst = [0] * 10' –

+1

Wariant na przykładzie ze zrozumieniem. Jeśli wszystkie elementy w tablicy muszą być puste przy inicjalizacji, użyj: 'arr = [Brak dla _ w zakresie (10)]'. –

5

(ten został napisany na podstawie oryginalnej wersji pytaniu)

chcę utworzyć pustą listę (lub cokolwiek jest najlepszym sposobem) może pomieścić 10. elementy.

Wszystkie listy mogą zawierać dowolną liczbę elementów, zależnie od limitu dostępnej pamięci. Jedynym "rozmiarem" listy, która ma znaczenie, jest liczba elementów aktualnie w niej:.

ale kiedy go uruchomić, wynik jest []

print display s1 składnia nie jest ważne; na podstawie twojego opisu tego, co widzisz, zakładam, że masz na myśli display(s1), a następnie print s1. Aby to działało, musisz wcześniej zdefiniować globalny s1, aby przejść do funkcji.

Wywołanie display nie zmienia listy, którą przekazujesz, jak napisano. Twój kod mówi: "s1 to nazwa dla każdej rzeczy, która została przekazana do funkcji, ok, teraz pierwszą rzeczą, jaką zrobimy, jest całkowite zapomnienie o tej rzeczy i pozwolimy s1 zacząć odsyłać do nowo utworzonego list. Zmodyfikuj ten list ". Nie ma to wpływu na wartość, którą podałeś.

Nie ma powodu, aby podawać tutaj wartość. (Nie ma prawdziwego powodu, aby utworzyć funkcję, ale to nie ma znaczenia.) Chcesz "stworzyć" coś, więc to jest wyjście twojej funkcji. Nie jest wymagana żadna informacja, aby stworzyć rzecz, którą opisujesz, więc nie podawaj żadnych informacji. Aby uzyskać informacje, należy to zrobić pod return.

To by dać coś takiego:

def display(): 
    s1 = list(); 
    for i in range(0, 9): 
     s1[i] = i 
    return s1 

Kolejnym problemem będzie zauważyć, że lista będzie rzeczywiście mieć tylko 9 elementów, ponieważ punkt końcowy jest pomijane przez funkcję range. (W notkach bocznych, [] działa równie dobrze jak list(), średnik jest niepotrzebny, s1 jest złą nazwą dla zmiennej, a tylko jeden parametr jest potrzebny dla range, jeśli zaczynasz od 0.) Tak więc kończysz z

def create_list(): 
    result = list() 
    for i in range(10): 
     result[i] = i 
    return result 

Jednak wciąż brakuje znaku; range nie jest jakimś magicznym słowem kluczowym, które jest częścią języka tak, jak są for i def, ale jest funkcją. I zgadnij, co ta funkcja zwraca? Zgadza się - lista tych liczb całkowitych. Tak więc cała funkcja zawala się do

def create_list(): 
    return range(10) 
, a teraz widzisz, dlaczego nie musimy sami pisać funkcji range jest już funkcją, której szukamy. Chociaż, znowu, nie ma potrzeby ani powodu do "wstępnego rozmiaru" listy.

32

varunl jest obecnie akceptowane odpowiedź

>>> l = [None] * 10 
>>> l 
[None, None, None, None, None, None, None, None, None, None] 

działa dobrze dla typów niereferencyjnych jak liczb. Niestety, jeśli chcesz utworzyć listę-list, natkniesz się na błędy odniesień. Przykład w Pythonie 2.7.6:

>>> a = [[]]*10 
>>> a 
[[], [], [], [], [], [], [], [], [], []] 
>>> a[0].append(0) 
>>> a 
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]] 
>>> 

Jak widać, każdy element wskazuje ten sam obiekt listy. Aby obejść ten problem, można utworzyć metodę, która zainicjuje każdą pozycję do odwołania do innego obiektu.

def init_list_of_objects(size): 
    list_of_objects = list() 
    for i in range(0,size): 
     list_of_objects.append(list()) #different object reference each time 
    return list_of_objects 


>>> a = init_list_of_objects(10) 
>>> a 
[[], [], [], [], [], [], [], [], [], []] 
>>> a[0].append(0) 
>>> a 
[[0], [], [], [], [], [], [], [], [], []] 
>>> 

Jest prawdopodobne, domyślny, wbudowany pyton sposób to zrobić (zamiast pisać funkcję), ale nie jestem pewien, co to jest. Byłbym szczęśliwy, gdyby został poprawiony!

Edit: To [ [] for _ in range(10)]

Przykład:

>>> [ [random.random() for _ in range(2) ] for _ in range(5)] 
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]] 
+10

Słyszałem, że używanie 'append' bardzo często jest gorsze od rozumienia list. Możesz stworzyć listę list przez '[[] dla _ w zakresie (10)]'. –

+2

Wycofano się, ponieważ wpadałem w złość, ponieważ miałem wielowymiarową tablicę z tymi samymi danymi powtarzanymi kilka razy i nie mogłem określić, co się dzieje, zanim w końcu znalazłem tę odpowiedź.^^ Nie rozumiem, dlaczego jest tu tak nisko. – Bregalad

7

Istnieją dwa "Quick" metody:

x = length_of_your_list 
a = [None]*x 
# or 
a = [None for _ in xrange(x)] 

Wydaje się, że [None]*x jest szybsze:

>>> from timeit import timeit 
>>> timeit("[None]*100",number=10000) 
0.023542165756225586 
>>> timeit("[None for _ in xrange(100)]",number=10000) 
0.07616496086120605 

Ale jeśli jesteś w porządku z zasięgiem (np. [0,1,2,3,...,x-1]), następnie range(x) może być najszybszy:

>>> timeit("range(100)",number=10000) 
0.012513160705566406 
1

Jestem zaskoczony nikt sugerują, że to proste podejście do tworzenia listy pustych list. To jest stary wątek, ale po prostu dodajemy to do kompletności. Pozwoli to stworzyć listę 10 pustych list

x = [[] for i in range(10)] 
-1
s1 = [] 
for i in range(11): 
    s1.append(i) 

print s1 

Aby utworzyć listę, po prostu korzystać z tych nawiasach "[]"

coś dodać do listy, użyj list.append()

1

Oto mój kod dla listy 2D w pythonie, która odczytałaby nie. wierszy od wejścia:

empty = [] 
row = int(input()) 

for i in range(row): 
    temp = list(map(int, input().split())) 
    empty.append(temp) 

for i in empty: 
    for j in i: 
     print(j, end=' ') 
    print('') 
0

dodanie do niesamowitych odpowiedziach pisemnych powyżej

po prostu utworzyć pustą listę, rzekomo z „zer” użytkowania,

lst=[0]*size 
0

natknąłem się na ten WIĘCEJ pytanie podczas szukania podobnego problemu. Musiałem zbudować tablicę 2D, a następnie zamienić niektóre elementy z każdej listy (w tablicy 2D) na elementy z dyktatury. Natrafiłem wtedy na this pytanie, które pomogło mi, może to pomoże innym początkującym w poruszaniu się. Kluczową sztuczką było zainicjowanie tablicy 2D jako tablicy numpy, a następnie użycie array[i,j] zamiast array[i][j].

Dla porównania jest to fragment kodu, w którym musiałem użyć tego:

nd_array = [] 
for i in range(30): 
    nd_array.append(np.zeros(shape = (32,1))) 
new_array = [] 
for i in range(len(lines)): 
    new_array.append(nd_array) 
new_array = np.asarray(new_array) 
for i in range(len(lines)): 
    splits = lines[i].split(' ') 
    for j in range(len(splits)): 
     #print(new_array[i][j]) 
     new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1) 

Teraz wiem, że możemy korzystać z listy ze zrozumieniem, ale dla uproszczenia używam zagnieżdżonej pętli for. Mam nadzieję, że to pomoże innym, którzy natkną się na ten post.

Powiązane problemy