Jak dołączyć na koniec pustej listy?

81

Mam listę:

list1=[]

długość listy jest nieokreślona, ​​więc próbuję dołączyć obiekty na końcu listy1 w następujący sposób:

for i in range(0, n):

    list1=list1.append([i])

Ale w moich wynikach nadal pojawia się ten błąd: AttributeError: Obiekt „NoneType” nie ma atrybutu „append”

Czy to dlatego, że lista1 zaczyna się jako pusta lista? Jak naprawić ten błąd?

LostLin
źródło
42
Nie -1 proszę. Fakt, że funkcja append () zwraca wartość None, może oszukać początkujących. Pytanie jest prawdziwe.
e-satis

Odpowiedzi:

73

appendfaktycznie zmienia listę. Ponadto wymaga elementu , a nie listy. Dlatego wszystko, czego potrzebujesz, to

for i in range(n):
   list1.append(i)

(Nawiasem mówiąc, pamiętaj, że range(n)w tym przypadku możesz użyć .)

Zakładam, że twoje rzeczywiste użycie jest bardziej skomplikowane, ale możesz być w stanie użyć rozumienia list, które jest bardziej pythonowe w tym przypadku:

list1 = [i for i in range(n)]

Lub, w tym przypadku, w Pythonie 2.x range(n)w rzeczywistości tworzy listę, którą już chcesz, chociaż w Pythonie 3.x, potrzebujesz list(range(n)).

Andrew Jaffe
źródło
dzięki, że ostatni kawałek był bardzo pomocny i skrócił mój kod o kilka
LostLin
@AndrewJaffe, a co z listą list?
Py-ser
1
To zależy od tego, co chcesz robić. appenddodaje do listy najbardziej zewnętrznej, ale możesz dołączyć do listy zagnieżdżonej, indeksując ją: a[-1].append(3)dołącza 3do ostatniej podlisty a.
Andrew Jaffe
18

Nie potrzebujesz operatora przypisania. append zwraca None.

Mikola
źródło
void nie istnieje w Pythonie. void to właściwie None
Jakob Bowyer
5

appendzwraca None, więc w drugiej iteracji wywołujesz metodę appendNoneType. Po prostu usuń przypisanie:

for i in range(0, n):
    list1.append([i])
Yuri Stuken
źródło
3

Mikola ma właściwą odpowiedź, ale trochę więcej wyjaśnień. Uruchomi się za pierwszym razem, ale ponieważ append zwraca None, po pierwszej iteracji pętli for, twoje przypisanie spowoduje list1wyrównywanie, Nonea zatem błąd zostanie wyrzucony przy drugiej iteracji.

Endophage
źródło
3

Osobiście wolę +operatora niż append:

for i in range(0, n):

    list1 += [[i]]

Ale to tworzy nową listę za każdym razem, więc może nie być najlepsza, jeśli wydajność jest krytyczna.

Petar Iwanow
źródło
1

Pamiętaj, że możesz również użyć wstawiania, aby umieścić numer na wymaganej pozycji na liście:

initList = [1,2,3,4,5]
initList.insert(2, 10) # insert(pos, val) => initList = [1,2,10,3,4,5]

Zauważ też, że w Pythonie zawsze możesz uzyskać długość listy za pomocą metody len ()

Artsiom Rudzenka
źródło
0

Jak powiedział Mikola, append()zwraca void, więc każda iteracja, którą ustawiasz list1 na inny niż typ, ponieważ append zwraca wartość nonetype. W następnej iteracji list1 ma wartość null, więc próbujesz wywołać metodę append wartości null. Wartości null nie mają metod, stąd Twój błąd.

Jan
źródło
-3

użyj my_list.append (...) i nie używaj, a inne listy do dołączenia jako lista są zmienne.

Ranjit
źródło
2
Ta odpowiedź jest trudna do zrozumienia (na przykład nie jestem pewien, co masz na myśli przez drugą część) i albo powtarza informacje z istniejących odpowiedzi (z 2014 r.), Albo (jeśli wziąć dosłownie) jest całkowicie błędna (kod OP zawiera brak my_listzmienna).
melpomene