Jestem stosunkowo nowy w programowaniu i Pythonie i próbuję omówić kilka pojęć. Jedynym, z którym się zmagam, jest funkcja split () i dlaczego te dwa fragmenty kodu dają dwa różne wyniki

y = ["hello\n", "world\n", "python\n"]
x = [line.strip() for line in y]
print(x)

I

y = ["hello\n", "world\n", "python\n"]
for line in y:
    x = [line.strip()]
print(x)

Pierwszy fragment kodu generuje dane wyjściowe

['hello', 'world', 'python']

Podczas gdy drugi produkuje

['python']

Czy ktoś wie, dlaczego tak jest, a ja uważam, że powinni zrobić to samo, wytwarzając wynik

['python']

Dzięki

3
jackcrouch 31 marzec 2020, 16:54

5 odpowiedzi

Najlepsza odpowiedź

Czy ktoś wie, dlaczego tak jest, a ja uważam, że powinni zrobić to samo, tworząc wyjście ['python'].

Twój pierwszy kod wykorzystuje rozumienie listy, które służy do tworzenia sekwencja. Zapewnia zwięzły sposób tworzenia list lub sekwencji elementów.

Twój drugi kod zasadniczo używa pętli for, aby pobrać ostatni element listy y. Pętla for jest używana, jeśli chcesz iterować przez sekwencję. Jednak nadpisujesz również zmienną x w każdej swojej iteracji, a zatem po wyjściu z pętli for będzie ona wskazywała na ostatni element (tj. ['Python']). Spróbuj tego:

for line in y:
    x = [line.strip()]
    print(x)

Jeśli chcesz tylko ostatni element listy y i usuń go (), możesz to również zrobić za pomocą:

x = [ y[-1].strip() ]

LUB

Jeśli chcesz mieć listę, użyj swojego pierwszego kodu.

WIĘCEJ INFORMACJI

Jeśli możesz zmienić swój drugi kod na:

x = [ ]
y = ["hello\n", "world\n", "python\n"]
for line in y:
    x.append(line.strip())
print(x)

Wtedy oba wydrukują to samo wyjście (tj. ['hello', 'world', 'python']).

2
abhiarora 31 marzec 2020, 14:13

W twoim pierwszym przypadku:

y = ["hello\n", "world\n", "python\n"]
x = [line.strip() for line in y]
print(x)

Używasz wyrażenia listowego do definiowania swojej zmiennej x przez iterację po wszystkich elementach z y i utrzymywanie ich na nowej liście, ta linia jest równoważna z:

x = []
for line in y:
    x.append(line.strip)

W drugim przypadku:

y = ["hello\n", "world\n", "python\n"]
for line in y:
    x = [line.strip()]
print(x)

Przypisujesz tej samej zmiennej x inną wartość w każdej iteracji pętli for oznacza to, że zmienna x będzie miała ostatnią wartość z listy {{X3} } (z zastosowanym str.strip)


Kolejny fajny sposób na osiągnięcie pożądanego wyniku:

list(map(str.strip, y))
1
kederrac 31 marzec 2020, 14:13

W drugim nadpisujesz x dla każdej iteracji pętli i widzisz tylko wartość x z ostatniej iteracji.

3
Pete 31 marzec 2020, 13:56

x = [line.strip()] tworzy nową listę z jednym elementem za każdym razem, gdy przechodzisz przez pętlę. Możesz łatwiej zobaczyć, co się dzieje, przesuwając print() wewnątrz pętli:

y = ["hello\n", "world\n", "python\n"]
for line in y:
    x = [line.strip()]
    print(x)
1
Code-Apprentice 31 marzec 2020, 14:01

Pierwsza wersja Twojego kodu używa rozumienia list, gdzie gromadzisz wyniki przetwarzania każdego elementu na liście wyjściowej zawierającej wszystkie elementy.

Podczas gdy w drugiej wersji przetwarzasz jeden element na raz wewnątrz pętli, zapisując wynik w liście jednoelementowej i nadpisując poprzednią wartość, więc po wyjściu z pętli zmienna będzie zawierać ostatni przetworzony element.

2
Óscar López 31 marzec 2020, 13:59