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?


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


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.


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

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.


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.


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


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.


-3

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.