TypeError: 'int' object is not subscriptable

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Eragon
User
Beiträge: 6
Registriert: Sonntag 24. November 2019, 11:16

Num='0325198450874160'
def Nummerker(Num):
l=[]
i=0
y=0
x=0
k=0
while x<len(Num):
if Num[0]==0:
y=x+4
for i in range(0,4):
if y== 0:
y=y-1
else:
if x==0:
l.pop(k[y])
y=x+4
for i in range(0,4):
if y== 0:
y=y-1
k=k+1
Nummerker(Num)


Traceback (most recent call last):
File "/home/pi/Documents/Bwinf/Nummernmerker.py", line 22, in <module>
Nummerker(Num)
File "/home/pi/Documents/Bwinf/Nummernmerker.py", line 16, in Nummerker
l.pop(k[y])
TypeError:int' object is not subscriptable



Ich habe das Problem, dass ich nicht weiß wie man den Fehler beheben kann.
Ich hoffe ihr könnt mir helfen. Vielen Dank im Voraus.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

"k" ist bei dir halt einfach ein Integer (wie die Fehlermeldung schon sagt). Da kannst du nur den Wert direkt von "k" nehmen. Ein Indexzugriff, wie du ihn hier offenbar versuchst, ist für Integer bzw Zahlen naturgemäß nicht möglich. Das geht nur für Listen, Strings und andere Container-Typen, weil die sich halt aus mehreren Einzelwerten zusammensetzen. Zahlen dagegen haben genau *einen* Wert. Falls du an die einzelnen Ziffern willst, dann müsstest du die Zahl vorher in einen String umwandeln.
Zuletzt geändert von snafu am Sonntag 24. November 2019, 12:01, insgesamt 1-mal geändert.
Eragon
User
Beiträge: 6
Registriert: Sonntag 24. November 2019, 11:16

"k" sollte die Elemente der Liste zählen, weil man ja pro durchlauf ein Element hinzugefügt und dann hat sich "k" auch immer erhöht.
Eragon
User
Beiträge: 6
Registriert: Sonntag 24. November 2019, 11:16

Aber als ich versucht habe dann das in einen String zu verwandeln dann hat das nicht funktioniert.
Benutzeravatar
snafu
User
Beiträge: 6741
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Einfach str(k) schreiben, wenn die Zahl als String genutzt werden soll. Bedenke dabei, dass der Originalwert von k (und somit auch der Typ) erhalten bleibt. Du musst mit der Rückgabe des Aufrufs arbeiten...
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich weiß gar nicht, was Du machen willst. Der Funktionsname trägt nicht gerade dazu bei, zu verstehen, was die Funktion machen soll, welche Nummer soll sich Num-Merker merken?
Einbuchstabige Variablennamen sind schlecht, weil sie auch nicht zum Verständnis beitragen.
Weder `Num` noch `x` ändern sich innerhalb der while-Schleife, so dass das eine Endlosschleife ist.
`Num[0]==0` kann nie wahr sein, da `Num` ja offensichtlich ein String ist und deshalb nicht gleich einer Zahl sein kann.
Die for-Schleife bei

Code: Alles auswählen

            for i in range(0,4):
                if y==0:
                    y=y-1
ist ziemlich nutzlos. `i` wird gar nicht benutzt und sollte `y` beim Eintritt 0 sein, so ist sie beim nächsten Schritt -1 und die restlichen drei Durchläufe machen nichts mehr.

Was soll die Funktion machen? Welche Gedanken hast Du Dir dann beim Lösen dieses Problems gemacht?
Eragon
User
Beiträge: 6
Registriert: Sonntag 24. November 2019, 11:16

Oh, ich habe gar nicht bemerkt, dass x sich nicht ändert und das programm sollte die Nummer in Blöcke aufteilen die dann aber mit keiner 0 beginnen.Deshalb sollte sich Nun auch nicht ändern.
Eragon
User
Beiträge: 6
Registriert: Sonntag 24. November 2019, 11:16

Nochmal zu snafu wie soll ich mit der Rückgabe des Aufrufs arbeiten?
Eragon
User
Beiträge: 6
Registriert: Sonntag 24. November 2019, 11:16

Eragon hat geschrieben: Sonntag 24. November 2019, 11:31 Num='0325198450874160'
def Nummerker(Num):
l=[]
i=0
y=0
x=0
k=0
while x<len(Num):
if Num[0]==0:
y=x+4
for i in range(0,4):
if y== 0:
y=y-1
else:
if x==0:
l.pop(k[y])
y=x+4
for i in range(0,4):
if y== 0:
y=y-1
k=k+1
Nummerker(Num)


Traceback (most recent call last):
File "/home/pi/Documents/Bwinf/Nummernmerker.py", line 22, in <module>
Nummerker(Num)
File "/home/pi/Documents/Bwinf/Nummernmerker.py", line 16, in Nummerker
l.pop(k[y])
TypeError:int' object is not subscriptable



Ich habe das Problem, dass ich nicht weiß wie man den Fehler beheben kann.
Ich hoffe ihr könnt mir helfen. Vielen Dank im Voraus.
Das Programm soll der Lösung von der BWINF Aufgabe Nummernmerker ausgeben.(Ich habe dies als Schulprojekt)
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hier mal die Aufgabe:
Aufgabe 2

Schreibe ein Programm, das Sarahs Mutter helfen kann, sich lange Nummern zu merken. Dein Programm soll eine Nummer, also eine Folge von Ziffern, einlesen und sie so in Blöcke aufteilen, dass gilt:
  • Jeder Block hat höchstens vier, aber mindestens zwei Ziffern.
  • Die Anzahl der Blöcke, die mit einer Null beginnen, ist minimal.
Du kannst davon ausgehen, dass eine einzulesende Nummer aus 2 bis 30 Ziffern besteht. Wende dein Programm auf alle Beispielnummern an, die sich auf der BWINF-Website befinden.
Hier sind die Nummern:
005480000005179734
03495929533790154412660
5319974879022725607620179
9088761051699482789038331267
011000000011000100111111101011
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

IMHO muss die Lösung übrigens entweder rekursiv sein (oder eine rekursive Lösung die iterativ ausgedrückt wurde) oder man muss nachvollziehbar erklären können, warum die nicht-rekursive Lösung auch garantiert eine Lösung mit minimaler Anzahl von mit Null beginnenden Blöcken findet.

Hier mal Infos zu den Nummern aus der Aufgabe:

Es gibt 33 Möglichkeiten 005480000005179734 nach den Regeln aufzuteilen.
Jeweils 2 Blöcke fangen mit 0 an.

Es gibt 1507 Möglichkeiten 03495929533790154412660 nach den Regeln aufzuteilen.
Jeweils ein Block fängt mit 0 an.

Es gibt 1198 Möglichkeiten 5319974879022725607620179 nach den Regeln aufzuteilen.
Kein Block fängt mit 0 an.

Es gibt 6886 Möglichkeiten 9088761051699482789038331267 nach den Regeln aufzuteilen.
Kein Block fängt mit 0 an.

Es gibt 404 Möglichkeiten 011000000011000100111111101011 nach den Regeln aufzuteilen.
Jeweils 3 Blöcke fangen mit 0 an.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten