(gelöst)Problem beim interieren in einer for-Schleife

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
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

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
Zuletzt geändert von Schaf220 am Montag 29. September 2008, 17:17, insgesamt 1-mal geändert.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

liste[position+1]
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

wenn ich das so mache sagt der mir immer list index out of range.

Code: Alles auswählen

position = position * liste[position + 1]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 :lol:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

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.
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

ah ok ich probiere es mal aus danke
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.
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

@BlackJack das wäre die elegante methode
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

@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
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

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.
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

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.
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)
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ß
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

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.
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);
        }
    }
}
Antworten