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.

Code: Alles auswählen

position = position * liste[position + 1]

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 :lol:

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