• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

PYTHON - Kopiowanie listy

Object Storage Arubacloud
+1 głos
353 wizyt
pytanie zadane 14 kwietnia 2022 w Python przez mewtwo Użytkownik (830 p.)

LNU PYTHON, 

mam problem z " if x[i] < 0 " oraz " if x[i] < 10 " nie mam pomysłu jak wyciągnąć wartość z listy.

 

do funkcji convert() przez parametr przekazano listę ocen testowanego produktu. W związku z wprowadzeniem dodatkowego systemu oceniania należy wartości w liście przekształcić w taki sposób, że wartości ujemne należy zamienić na wartość 0, zaś wartości większe od 10 na wartość 10. Funkcja powinna zwracać jedną listę, będącą połączeniem dwóch list: przekazanej przez parametr oraz zmodyfikowanej. 

Dodatkowy warunek: poradź sobie bez metody append(). 

Przykład:

Wejście: [ 5, -2, 2, 10, 12 ]
Wyjście: [ 5, -2, 2, 10, 12, 5, 0, 2, 10, 10 ]

Kod: 

def convert( x ):
    
    copy_x = list(x)
    
    for i in copy_x:
        
        if copy_x[i] < 0:
            copy_x[i] = 0
        elif copy_x[i] > 10: 
            copy_x = 10
            
    return x + copy_x

 

2 odpowiedzi

0 głosów
odpowiedź 14 kwietnia 2022 przez adrian17 Ekspert (344,860 p.)
wybrane 14 kwietnia 2022 przez mewtwo
 
Najlepsza

Błąd masz tutaj:

    for i in copy_x:
(...)
        if copy_x[i]

Pętla `for` iteruje się po elementach, nie indeksach. Jeśli chcesz używać indeksy (np do modyfikowania listy), potrzebujesz indeksy, które możesz uzyskać iterując się po range() lub enumerate().

(Tylko dla formalności zaznaczę że można to też rozwiązać bez indeksów i modyfikowania - budując nową listę od zera)

komentarz 14 kwietnia 2022 przez mewtwo Użytkownik (830 p.)

Dziękuje za podpowiedź, 

udało mi się rozwiązać to zadanie 

def convert( x ):
    
    copy_x = list(x)
    index = 0
    
    for i in copy_x:
        
        if copy_x[index] < 0:
            copy_x[index] = 0
        elif copy_x[index] > 10: 
            copy_x[index] = 10
            
        index += 1
        
    return x + copy_x

Jeżeli masz jeszcze jakieś uwagi do mojego kody napisz, z chęciom przeczytam :)

 

komentarz 14 kwietnia 2022 przez adrian17 Ekspert (344,860 p.)

Tak jak mówiłem, zarówno range() jak i enumerate() by to zapisały jaśniej, bo nie trzeba ręcznie inkrementować licznika:

for index, e in enumerate(copy_x):
    if e < 0:
        copy_x[index] = 0

# lub

for index in range(len(copy_x)):
    if copy_x[index] < 0:
        copy_x[index] = 0

No i można to też rozwiązać w ogóle bez myślenia o indeksach i modyfikowaniu listy, bo można drugą listę zbudować od zera wołając na niej push() w pętli. (albo użyć list comprehension, ale zgaduję że jeszcze o nich nie słyszałeś)

komentarz 14 kwietnia 2022 przez mewtwo Użytkownik (830 p.)
Dziękuje, rozwiązanie z range() bardziej do mnie przemawia niż enumerate(). Dzięki temu mój kod będzie o wiele czystszy i bardziej intuicyjny. :)
0 głosów
odpowiedź 14 kwietnia 2022 przez VBService Ekspert (253,340 p.)

Proponuję użycie map()

 

przykład  [ on-line ]

def convert( x ):
    return x + list(map((lambda x: 0 if x<0 else 10 if x>10 else x), x))

x = [ 5, -2, 2, 10, 12 ]

print('Wejście:', x)
print('Wyjście:', convert(x))

 

P.S. How to Use Python Lambda Functions

1
komentarz 14 kwietnia 2022 przez mewtwo Użytkownik (830 p.)
Dziękuje za twoją propozycję :)

Podobne pytania

0 głosów
2 odpowiedzi 225 wizyt
pytanie zadane 6 listopada 2022 w Python przez Ichbinda Nowicjusz (230 p.)
0 głosów
1 odpowiedź 312 wizyt
pytanie zadane 13 września 2022 w Python przez Ziom Początkujący (430 p.)
0 głosów
1 odpowiedź 234 wizyt
pytanie zadane 21 kwietnia 2022 w Python przez niezalogowany

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...