• 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

0 głosów
1,278 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ź 535 wizyt
0 głosów
1 odpowiedź 2,031 wizyt
pytanie zadane 2 listopada 2019 w Python przez KitoPlayerPL Nowicjusz (150 p.)
+1 głos
1 odpowiedź 513 wizyt
pytanie zadane 5 kwietnia 2022 w Python przez qwert 100 Obywatel (1,250 p.)

93,762 zapytań

142,717 odpowiedzi

323,368 komentarzy

63,359 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...