Seite 1 von 1
(gelöst)Problem beim interieren in einer for-Schleife
Verfasst: Montag 15. September 2008, 18:31
von Schaf220
Hallo liebe Community,
Ich habe leider folgendes Problem und ich hoffe ihr könnt mir helfen.
Also ich habe eine Liste, durch diese interiere ich mit einer for-Schleife ich versuche es zu mindestens. Das sieht dann so aus:
Code: Alles auswählen
liste = ["r", "l", "d", "t", "x", "t", "a", "b", "c", "d", "š", "E", "a", "b", "c", "d"]
for position in liste:
if position >= chr(128):
position = ord(position) - 127
position = position * ?
print position
Nun ja das Zeichen vor "E" ist ein Ascii-zeichen und nachdem ich es verglichen habe kommt dort 27 raus. Jetzt möchte ich die 27 * das "E" nehmen so das da dann "EEEEEEEEEEEEEEEEEEEEEEEEEEE" steht, nur ich weiss nicht wie ich auf das nächste Element zugreife in einer for-Schleife.
Das Fragezeichen oben im Code steht für meine Gedankenlücke =)
Mfg Schaf220
Verfasst: Montag 15. September 2008, 18:40
von sea-live
liste[position+1]
Verfasst: Montag 15. September 2008, 18:44
von Schaf220
wenn ich das so mache sagt der mir immer list index out of range.
Verfasst: Montag 15. September 2008, 18:49
von Leonidas
Was soll denn der Quellcode machen? Im Moment sieht das eher nach einem Code-Unfall aus, der ausschaut wie Code, aber eigentlich keinen Sinn macht. Wie Lorem Ipsum etwa.
sea-life, das ist doch genauso falsch, da ``position`` unvorteilhafterweise ein Buchstabe und keine Zahl ist.
Verfasst: Montag 15. September 2008, 18:52
von DasIch
Leonidas hat geschrieben:sea-life, das ist doch genauso falsch, da ``position`` unvorteilhafterweise ein Buchstabe und keine Zahl ist.
Beim Fragezeichen nicht mehr, wobei wir wieder beim Code Unfall wären.
Verfasst: Montag 15. September 2008, 18:55
von Leonidas
DasIch hat geschrieben:Leonidas hat geschrieben:sea-life, das ist doch genauso falsch, da ``position`` unvorteilhafterweise ein Buchstabe und keine Zahl ist.
Beim Fragezeichen nicht mehr, wobei wir wieder beim Code Unfall wären.
Ja, tatsächlich
Verfasst: Montag 15. September 2008, 18:57
von sea-live
so solte es gehen
Code: Alles auswählen
liste = ["r", "l", "d", "t", "x", "t", "a", "b", "c", "d", "š", "E", "a", "b", "c", "d"]
for position,chare in enumerate(liste):
if chare >= chr(128):
anzahl = ord(chare) - 127
#position = position * ?
print position
print chare
print anzahl
chare_next = liste[position+1]
print chare_next
neu = anzahl * chare_next
print neu
liste[position+1] = neu
print liste
Verfasst: Montag 15. September 2008, 18:59
von Schaf220
Also was ist jetzt noch unkla daran?
Ich möchte das Zeichen vielleicht wird es so eindeutiger:
Code: Alles auswählen
liste = ["r", "l", "d", "t", "x", "t", "a", "b", "c", "d", "27", "E", "a", "b", "c", "d"]
for position in liste:
if position >= chr(128):
position = ord(position) - 127
position = position * ?
print position
Und ich weiss nicht wie ich die 27 mal die nächste position nehmen soll.
Verfasst: Montag 15. September 2008, 19:00
von Schaf220
ah ok ich probiere es mal aus danke
Verfasst: Montag 15. September 2008, 19:01
von BlackJack
Werden soll das wohl eine Entpacker für
Lauflängenkodierung.
Ich würde mit `iter()` einen Iterator über die Eingabedaten erzeugen und den vor der Schleife an einen Namen binden. Dann kann man an der entsprechenden Stelle in der Schleife die `next()`-Methode aufrufen um den Wert zu bekommen, der wiederholt werden soll.
Verfasst: Montag 15. September 2008, 19:03
von sea-live
@BlackJack das wäre die elegante methode
Verfasst: Montag 15. September 2008, 19:06
von Leonidas
Was unklar ist? Na was das werden soll.
Code: Alles auswählen
>>> liste = ["r", "l", "d", "t", "x", "t", "a", "b", "c", "d", "27", "E", "a", "b", "c", "d"]
>>> for char in liste:
... if char.isupper():
... print ord(char) * char
Verfasst: Montag 15. September 2008, 19:09
von sea-live
@leonidis
wenn er das E halt 27x in der liste hinter dem char(27) haben will bitte
is doch sein problem was das werden soll
Verfasst: Montag 15. September 2008, 19:09
von Schaf220
Ach so sorry ich habe also wie Black Jack schon gesagt vor einen Entpacker zu coden und so sieht die gepackte Datei aus.
liste = ["r", "l", "d", "t", "x", "t", "a", "b", "c", "d", "š", "E", "a", "b", "c", "d"]
Das Ascii zeichen steht für die Wiederholung des folgenden Zeichen in dem Fall 27 das will ich jetzt wieder entpacken, also die 27 E wieder hin schreiben.
Verfasst: Montag 15. September 2008, 19:25
von Schaf220
Sorry ich verstehe den Code von dir Leonidas nicht genau ich habe es mal um gesetzt und dann sieht das jetzt so aus aber der Counter und des E sollen ja weg und dafür dei 27x E da stehen.
Ich lerne noch nicht sehr lange python deswegen verstehe ich noch nicht jeden code entschuldigung dafür es wäre gut wenn ihr euren Code erklären könntet, wenn es eucht nichts ausmacht.
Mfg Schaf220
Code: Alles auswählen
for char in data:
if char.isupper():
print ord(char) * char
print char
else:
print char
So steh das jetzt bei mir aber klappt leider nicht so richtig.
Verfasst: Montag 15. September 2008, 20:48
von BlackJack
@Schaf220: Deine Darstellung der Daten ist übrigens suboptimal, weil der Bytewert von 'š' von der verwendeten Kodierung abhängt. Nicht jeder verwendet cp1252.
Code: Alles auswählen
def unpack(data):
result = list()
data = iter(data)
for character in data:
if ord(character) > 127:
result.append(data.next() * (ord(character) - 127))
else:
result.append(character)
return ''.join(result)
def main():
packed_data = 'rldtxtabcd\x9aEabcd'
print unpack(packed_data)
Verfasst: Montag 15. September 2008, 21:00
von abgdf
Ach so, jetzt ist's schon fertig ...
Hatte sowieso nicht genau verstanden, wie das gemeint war.
War (dicht am Original) soweit:
Code: Alles auswählen
l = ["r", "l", "d", "t", "x", "t", "a", "b", "c", "d", "s", "E", "a", "b", "c", "d"]
l2 = l[:]
for i in range(0, len(l) - 1, 1):
l2[i + 1] = ord(l[i]) * l[i + 1]
for i in l2:
print i
Gruß
Verfasst: Dienstag 16. September 2008, 08:26
von sea-live
DANKE an die Moderatoren für die ausführlich hilfestellung und das Eindrucksvolle aufzeigen der OOp Sprachorientierten Programmierung
Leute wie ich und auch warscheinlich Schaf220 die von der ablauforitierten seite kommen
denken in diesen sachen in die falsche richtung.
Verfasst: Dienstag 16. September 2008, 10:44
von BlackJack
Also ich sehe da jetzt nicht besonders viel OOP-spezifisches. Meine Lösung ist doch "ablauforientiert". Mal abgesehen von der Polymorhie bietet das nicht so besonders viel mehr als dieses (ungetestete) C-Schnippsel:
Code: Alles auswählen
void unpack(void)
{
int byte, count, i;
while ((byte = get_byte()) != -1) {
if (byte & 0x80) {
count = byte & 0x7f;
byte = get_byte();
for (i = 0; i < count; ++i) put_byte(byte);
} else {
put_byte(byte);
}
}
}