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

question-closed IndexError: string index out of range - Python

Object Storage Arubacloud
0 głosów
893 wizyt
pytanie zadane 6 czerwca 2019 w Python przez Ventre90 Obywatel (1,170 p.)
zamknięte 8 czerwca 2019 przez Ventre90

Cześć drodzy pasjonaci. Pisze program który w założeniu ma wyznaczać 2 ostatnie wyrazy silni dla n-tej liczby ( l.dziesiątek / l. jedności).

Napotkałem na problem w ostatnim elsie w funkcji. Przy konwersji na string i próbie wyindeksowania wyrazów stringu od tyłu dostaje error jak w tytule. Silnia z 4 to 24 więc ma dwa znaki. (problm dotyczy przedziału liczb 4-11) Oczekiwany rezultat wyświetlenia np dla 4 to:

2 4

Uprzejmie proszę

def silnia(n): 
    z = ""
    if n == 1:
        z = "0 1"
        return z
    elif n == 2:
        z = "0 2"
        return z
    elif n == 3:
        z = "0 6"
        return z
    else:
        s = 1
        for i in range (1,n+1):
            s = s * i
            if n > 11:
                z = "0 0"
                return z
            else:
                s = str(s)
                z = print(s[-2], s[-1])
                return z
  


test_num = int(input()) # liczba testów
for j in range (test_num):
    print (silnia(int(input())))

o pomoc.

komentarz zamknięcia: Temat wyjaśniony

1 odpowiedź

+2 głosów
odpowiedź 6 czerwca 2019 przez DeBos123 Nałogowiec (44,950 p.)
wybrane 8 czerwca 2019 przez Ventre90
 
Najlepsza

Zmienna s w linii 20 ma wartość 1 dla 4.

Linie 16 do 22 powinny być poza pętlą.

Co do samego kodu to nie powinno być tu w ogóle zmiennej z. Jest ona niepotrzebna.

Mógłbyś również zamienić:

print(s[-2], s[-1])

na:

print(' '.join(s[-2:]))

Co oznacza, że zostaną wypisane wszystkie elementy zaczynając od przedostatniego i zostaną połączone spacją.

Ten sposób ma jedną wadę, mianowicie jeżeli nie ma dziesiątek zostanie wypisana tylko liczba jedności, więc dalej potrzebujesz linii od 3 do 12. Mógłbyś jednak to naprawić zamieniając poprzedni kod na:

print(' '.join(([0] if len(s)==1 else [])+s[-2:]))

Co oznacza, że jeżeli ilość cyfr jest równa 1 to na początek zostanie dodane 0.

Powinieneś również zamienić > na >= w linii 16, ponieważ dla 11 wynik też będzie 0 0.

Czyli finalny kod wygląda następująco:

def silnia(n): 
    if n>=11:
        return "0 0"
    else:
        s=1
        for i in range (1,n+1):
            s=s*i
        else:
            return ' '.join(('0' if len(str(s))==1 else '')+str(s)[-2:])
   
 
 
test_num = int(input()) # liczba testów
for j in range (test_num):
    print (silnia(int(input())))

Jeżeli masz jakieś pytania to pisz.

komentarz 7 czerwca 2019 przez Ventre90 Obywatel (1,170 p.)

DeBos123 serdecznie dziękuje za poświęcenie czasu na odpowiedź. Super to udoskonaliłeś i wytłumaczyłeś wszystko bardzo klarownie. Doceniam.

Mam jeszcze pytanie o jeden aspekt. Wiem, że ten kod powinien wyglądać tak jak zaproponowałeś (i w sumie i tak już go tak zrefaktoryzowałem). Jednak powróćmy na chwile do mojego kodu z nadmiarem ifow i niepotrzebna zmienna z:


def silnia(n): 
    z = ""
    if n == 1:
        z = "0 1"
        return z
    elif n == 2:
        z = "0 2"
        return z
    elif n == 3:
        z = "0 6"
        return z
    elif n >= 11:
            z = "0 0"
            return z
    else:
        s = 1
        for i in range (1,n+1):
            s = s * i
        s = str(s)
        z = (s[-2], s[-1])
    return z
   # return ' '.join(str(s)[-2:])

Pytam o ostatniego elsa ( linie 15 - 21) Dlaczego wynik tego kodu dla cyfr 4-9 daje wynik:

4
('2', '4')
5
('2', '0')
6
('2', '0') ...itd.

Chodzi mi ze nie chce mieć tych niepotrzebnych nawiasów. Wiem że python tak oznacza pewnie str. Natomiast  w funkcji 'join' tez każesz mu zaznaczyć 2 ostatnie wyrazy zmiennej str tylko, że rozdzielone spacja. Ja tym indeksowaniem robie (tak mi sie wydaje to samo), a rezultat jest taki jak widać. Dlaczego tak sie dzieje ?

Oczywiście jak skasuje te linie 19-21 i zostawie tylko to 22 to wszystko hula. Nie rozumiem tej różnicy.

komentarz 7 czerwca 2019 przez DeBos123 Nałogowiec (44,950 p.)

DeBos123 serdecznie dziękuje za poświęcenie czasu na odpowiedź. Super to udoskonaliłeś i wytłumaczyłeś wszystko bardzo klarownie. Doceniam.

Nie ma sprawy.

Pytam o ostatniego elsa ( linie 15 - 21) Dlaczego wynik tego kodu dla cyfr 4-9 daje wynik:


('2', '4') 

('2', '0') 

('2', '0') ...itd.

Do zmiennej z przypisujesz krotkę, czyli taką jakby tablicę.

Wiem że python tak oznacza pewnie str.

Python jak oznacza krotkę. 

Natomiast  w funkcji 'join' tez każesz mu zaznaczyć 2 ostatnie wyrazy zmiennej str tylko, że rozdzielone spacja.

Funkcja join działa na tej zasadzie, że łączy wszystkie elementy tablicy lub krotki ogranicznikiem, w tym przypadku spacją. 

Ja tym indeksowaniem robie (tak mi sie wydaje to samo), a rezultat jest taki jak widać. Dlaczego tak sie dzieje ?

Dla przykładu silnia z 4 to 24. W tym momencie s[-1] to jest pierwszy znak od końca czyli 4, a s[-2] to drugi znak od końca.

Zapis (s[-2], s[-1]) oznacza stworzenie krotki z dwoma elementami. 

komentarz 8 czerwca 2019 przez Ventre90 Obywatel (1,170 p.)

Tak to była krotka wink Początkowo sądziłem że tan nawias był potrzebny.

Jednak jak zapisałem s = s[-2] +" "+ s=[-1] - to wszystko działa jak trzeba. Faktycznie join załatwia temat jednak musiałem przekształcić ten mój zapis żeby mieć czyste sumienie.

Wielkie dzięki za pomoc. Oznaczam ODP i zamykam wątek.

komentarz 13 listopada 2019 przez markaldo Nowicjusz (100 p.)

@DeBos123,

In Python, a string is a single-dimensional array of characters. The string index out of range means that the index you are trying to access does not exist. In a string, that means you're trying to get a character from the string at a given point. If that given point does not exist , then you will be trying to get a character that is not inside of the string. Indexes in Python programming start at 0. This means that the maximum index for any string will always be length-1. There are several ways to account for this. Knowing the length of your string (using len() function)could certainly help you to avoid going over the index.

Podobne pytania

+1 głos
1 odpowiedź 284 wizyt
0 głosów
1 odpowiedź 1,554 wizyt
pytanie zadane 2 listopada 2019 w Python przez KitoPlayerPL Nowicjusz (150 p.)
+1 głos
1 odpowiedź 211 wizyt
pytanie zadane 5 kwietnia 2022 w Python przez qwert 100 Obywatel (1,250 p.)

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,939 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!

...