Tworzenie nowej listy wg warunku wystąpienia ostaniego znaku.

0

Witam

Dzień po dniu robię jakiś mały kroczek w poznawaniu działania Python ,ale tutaj proszę o pomoc.
Posiadam listę z ligami:

ligi = ['Anglia1p', 'Anglia2p','Hiszpania1p','Polska1s','Włochy1s']
nowe[]

Elementy z listy kończą się literkami s lub p.
Potrzebują wyciągnąć z tej listy dane ,które kończą się na literkę "s".
W kombinacjach doszedłem do tego ,że mogę to zrobić indexem i lenem.

ligi[0][len(ligi[0])-1]

Taka wartość zwróci mi ostatni znak z podanego indexu listy.
Próbowałem opisać warunek w pętli ,alby iterować po całej liście dla spełnienia warunku ="s" i pobraniu TRUE do nowej listy nowe[] ,ale niestety popełniam błędy.

for i in ligi:
    if ligi[0][len(ligi[0])-1] == "s":
    nowe.append(ligi[i])
print(nowe)

Przerabiam różne ćwiczenia 2 tydzień w Pythonie i jeszcze wszystkie nie rozumiem tak jak wy koledzy i koleżanki.
Proszę o wskazówki.
Pozdrawiam

5

https://www.w3schools.com/python/ref_string_endswith.asp
oraz if również wymaga wcięcia czyli:

for i in ligi:
    if ligi[0][len(ligi[0])-1] == "s":
        nowe.append(ligi[i])

ale zawsze da się zapisać w jednym wierszu: nowe=[x for x ...]

5

Co to jest to, nowe[]?

A spróbuj, list comprehension:

[elem for elem in ligi if elem.endswith('s')]  # -> ['Polska1s', 'Włochy1s']

A jeszcze lepiej generator expression:

gen_end_s = (elem for elem in ligi if elem.endswith('s'))
print(list(gen_end_s))  # -> ['Polska1s', 'Włochy1s']

EDIT: Ach, teraz widzę :), nowe to miała być nowa lista, to nie tak, tak: nowe = [].

4

Odwoływanie się do pozycji w kolekcji korzystając z kolekcja[len(kolekcja) - 1] jest… mało pythonowe. On domyślnie ma slicing i ujemne indeksowanie: możesz zastąpić ligi[0][len(ligi[0])-1] po prostu ligi[0][-1]. Czy raczej, i[-1] — bo i Ci przebiega ligi, przyjmując kolejno (z każdą iteracją) wartość kolejnego elementu. Nie jest liczbą — indeksem — więc ligi[i] nie ma sensu. Podobnie, problemem jest to, że w pętli się odwołujesz za każdym razem do tego samego elementu: ligi[0], zamiast do i.

No i wreszcie, tak jak Ci lion137, nie ma potrzeby używania „ogólnej” pętli — list comprehension jest jak najbardziej wystarczające, a jeszcze lepszym rozwiązaniem tutaj, w mojej opinii, byłby po prostu filter: nowe = list(filter(lambda x: x.endswith('s'), ligi)). Być może wystarczy Ci nawet sam generator i nie ma potrzeby robienia z niego listy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1