2013-09-03 15 views
7

Chcę zainicjować listę w python. Nie rozumiem dlaczego poniższy kod nie działa:inicjowanie członków listy

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 
for item in u: 
item = len(item) 

Istnieją inne sposoby, aby zainicjować listy, jak:

u = [len(item) for item in u] 

Ale moje pytanie jest dlaczego pierwszy kod nie działa.

Edytuj: Jestem początkującym w Pythonie i programowaniu. Niestety nie rozumiem niektórych części twoich odpowiedzi. Na przykład:
- ponownego wiązania w ponownego wiązania nazwa item do długości nazwy item
- iteratora w „pozycji” jest tymczasowa zmienna, która wskazuje na element u na podstawie gdzie (implicite) iterator wskazuje
o ile rozumiem, mój drugi przykład tworzy new_list w pamięci i przypisuje wartości new_list do u. Bez względu na poprzednie wartości. Ale chcę wiedzieć, w jaki sposób mogę zmienić wartości na pierwszej liście. Dzięki

Odpowiedz

4

W pierwszym przypadku niczego nie inicjujesz. "item" jest zmienną tymczasową, która wskazuje na element u na podstawie wskazania (niejawnego) iteratora. Jeśli chcesz zainicjować listę w pierwszym stylu, można zrobić tak:

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 
v = [] 
for item in u: 
    v.append(len(item)) 
print v 
3

Powodujesz ponowne przypisanie nazwy item do długości nazwy item, która była związana przez pętlę. W ten sposób nie można zainicjować list. Wszystko, co robisz, to ponowne wiązanie zmiennej w każdej iteracji. Zrozumienie listy jest całkowicie dopuszczalną metodą inicjowania list.

+0

element jest ciągiem w pierwszym przypadku, ponieważ elementy listy u są ciągami. Można wywołać len() na łańcuchach. –

+1

Tak, poprawiłem swoją odpowiedź. –

0

Pierwszy kod robi pracy. Lista u jest inicjowana w pierwszym wierszu, a kolejne dwie linie są wykonywane bez wpływu na resztę kodu - nie ma dla nich sensu.

u = ['abc', 'de', 'fghi', 'jklm', 'n', ''] 

inicjuje listę u z treścią ['abc', 'de', 'fghi', 'jklm', 'n', ''] - to wszystko, co trzeba zrobić, aby zainicjować listę.

Linie

for item in u: 
    item = len(item) 

Wystarczy powiązać nazwę item do wszystkich wartości w u niezwłocznie po ponownie powiązać item do nieruchomości długość wartości jednego po drugim, aż tłumacz pracował przez całe liście.

+1

Tę odpowiedź można poprawić, mówiąc OP, jak faktycznie zainicjować listę. – kojiro

1

Nie można zmienić zawartości listy przez przypisanie nowej wartości do nazwy reprezentującej pozycję na tej liście. Musisz użyć przypisania indeksu, na przykład, aby zmienić pierwszy wpis na liście na 'foo', co możesz zrobić u[0] = 'foo'.

W tym przypadku można zrobić coś jak następuje (chociaż lista rozumienie ze kwestionujesz jest czystsze):

for i, item in enumerate(u): 
    u[i] = len(item) 

pamiętać, że jeśli pozycje w liście są zmienne można modyfikować elementu bezpośrednio, po prostu nie możesz ich ponownie przypisać. Na przykład z listy list:

u = [['a'], ['b', 'c']] 
for item in u: 
    item.append(len(item)) 
# u is now [['a', 1], ['b', 'c', 2]] 
1

Powód pierwszy kod nie działa dlatego item jest tylko odniesienie do każdego iterowalny obiektu w sekwencji u. Kiedy mówisz: item = len(item), faktycznie przypisujesz len(item) do item, ale ponieważ item działał po prostu jako wskaźnik referencyjny wskazujący na u[i] dla i * th * kroku w twojej pętli, to nie zmieni się sam w sobie u[i].

Aby zmienić u[i] można zrobić listowych jak pokazałeś w swoim pytaniu, czy coś takiego:

for i in range(len(u)): 
    u[i] = len(u[i]) 

Trzecim sposobem jest bardzo przydatna enumerate metoda wprowadzona w Pythonie 2.3.

for i, item in enumerate(u): 
    u[i] = len(item) 

Enumerate zwraca listę krotek utworzonych z jego argumentów (nie cytuję mnie na tym ... ale to w zasadzie akty postaci listy krotek), gdzie każda krotka wewnątrz jest postaci (indeks , argument [indeks]).

+0

Powinieneś mieć 'u [i] = len (item)' w przykładzie 'wyliczenia'. –

+0

Zmieniono. Dzięki. – Shashank

0

item to tylko nazwa nazwa. w for pętli:

for item in u: 

item jest odniesienia do obiektu, do którego U [b] odnosi. Innymi słowy, item i u[i] odnoszą się do tego samego obiektu.

ale to stwierdzenie:

item = len(item) 

zmiana nazwy item do odnoszą do int, którego wartość jest len ​​(pozycja).

Nic nie zmieniło się na liście u.

Lista rozumienie:

u = [len(item) for item in u] 

jest po prostu utworzyć nową listę, a nazwa u jest teraz odniesienie do nowej listy.

Jeśli chcesz użyć pętli, można użyć instrukcji enumerate:

for i, item in enumerate(u): 
    u[i] = len(item) 

który zmienia referrings z elementów u pojedynczo.