Zeilen kuerzen

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.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Wobei man bei gute Editoren / IDE's die Einrückung in Leerzeichen pro Tab einstellen kann
the more they change the more they stay the same
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Werde die Einrückungen korrigieren.

In der zwischen Zeit habe ich versucht den Originalen Code von Hyperion zu erweitern um die Start und Endposition des gefunden Fragmentes mit auszugeben, aber leider bekomme ich falsche Werte.

Code: Alles auswählen

def shorten(row, vallimit=79, rowlimit=29):
    values = map(int, row.strip().split(","))
    res = []
    tmp = []
    startPos = 0
    aktulPos = 0
    neuePos  = False
    for val in values:
        if val >= vallimit:
            if (neuePos == False):
                startPos += 1
            tmp.append(val)
        else:
            if len(tmp) > rowlimit:
                res.extend([tmp, startPos, aktulPos - 1])
            tmp = []
            startPos = aktulPos
        aktulPos +=1
    # neu
    if len(tmp) > rowlimit:
        res.extend([tmp, startPos, aktulPos - 1])
    if res:
        return ",".join(map(str, res))   

in_data = """83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,83,66,66,66,66,66,66
66,66,66,83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,83,66,66,66
66,66,66,66,66,66,83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,83
66,66,66,83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,80,80,80,83
83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83
65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65
83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,66,66,66,66,66,66,66,66,66,66,66,66,66,66
83,83,83,65,65,65,83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,83
83,83,65,83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,83,65,83,83
68,77,88,89,88,88,88,89,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66
68,77,88,89,88,88,88,89,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66
97,97,97,97,97,97,97,97,97,97,97,86,82,69,91,85,85,88,91,72,91,93,91,97,97,97,97,97,95,91,77,69,77,95,95,93
79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79"""

i = 0
for line in in_data.split("\n"):
    i += 1
    print str(i) + " ",
    print shorten(line)
Die Ausgabe sieht wie folgt aus:

Code: Alles auswählen

1  [83, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 83],30,29
2  [83, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 83],32,32
3  [83, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 83],35,35
4  [83, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 83],35,35
5  [83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83],36,35
6  None
7  None
8  [83, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 83],35,35
9  [83, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, 83, 83, 83, 83, 83, 80, 80, 80, 80, 80, 80, 80, 83],32,32
10  None
11  None
12  None
13  [79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79],36,35
Was mache ich falsch?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mit hat geschrieben:Was mache ich falsch?
Imho alles! Indem Du nämlich Dinge zu Deiner Aufgabenstellung hinzunimmst, die sich mit der ursprünglichen beißen.

Die Start-End-Positionen einer jeden Sequenz verkomplizieren das doch immens, da es ja beliebig viele pro Zeile geben kann. Also müßtest Du dann die Datenstruktur entsprechend erweitern. Zudem ist dann die Frage, wie das entgültige Ausgabeformat aussehen soll. Bisher sollten ja wieder alle Werte als CSV ausgegeben werden.

Also: Spezifiziere mal, genau, was Du haben willst. Dann kann man über eine geeignete Ziel-Datenstruktur nachdenken und dann über eine Formatierungsfunktion für die Ausgabe.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Es darf nur ein Fragment geben, da die Mindestlänge 30 so gewählt wird dass es nur ein Fragment geben kann oder gar kein. Die Methode sollte nur die Start und Endpostion des gefunden Fragment zurück liefern.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mit hat geschrieben:Es darf nur ein Fragment geben, da die Mindestlänge 30 so gewählt wird dass es nur ein Fragment geben kann oder gar kein.
Das hättest Du auch mal eher sagen können...
Die Methode sollte nur die Start und Endpostion des gefunden Fragment zurück liefern.
Na das ist doch simpel

Code: Alles auswählen

def shorten(row, vallimit=79, rowlimit=29):
    values = map(int, row.strip().split(","))
    # positionen (nicht im String, sondern in der Werteliste!)
    start = stop = 0
    # zustand merken
    in_seq = False
    for index, val in enumerate(values):
        if val >= vallimit:
            if not in_seq:
                start = index
                in_seq = True
        else:
            stop = index
            in_seq = False
            if stop - start > rowlimit:
                return start, stop
Ohne zu testen allerdings...
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Ich bekomme folgende Falsche ausgabe:

Code: Alles auswählen

1  (0, 30)
2  (3, 33)
3  None
4  None
5  None
6  (0, 30)
7  (0, 30)
8  None
9  (3, 33)
10  (2, 32)
11  (2, 32)
12  None
13  None
mit diesem Test code:

Code: Alles auswählen

def shorten(row, vallimit=79, rowlimit=29):
    values = map(int, row.strip().split(","))
    # positionen (nicht im String, sondern in der Werteliste!)
    start = stop = 0
    # zustand merken
    in_seq = False
    for index, val in enumerate(values):
        if val >= vallimit:
            if not in_seq:
                start = index
                in_seq = True
        else:
            stop = index
            in_seq = False
            if stop - start > rowlimit:
                return start, stop   

in_data = """83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,83,66,66,66,66,66,66
66,66,66,83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,83,66,66,66
66,66,66,66,66,66,83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,83
66,66,66,83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,80,80,80,83
83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83,83
65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65
83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,66,66,66,66,66,66,66,66,66,66,66,66,66,66
83,83,83,65,65,65,83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,83
83,83,65,83,80,80,80,80,81,81,81,81,81,81,82,82,82,82,82,82,83,83,83,83,83,80,80,80,80,80,80,80,83,65,83,83
68,77,88,89,88,88,88,89,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66
68,77,88,89,88,88,88,89,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66
97,97,97,97,97,97,97,97,97,97,97,86,82,69,91,85,85,88,91,72,91,93,91,97,97,97,97,97,95,91,77,69,77,95,95,93
79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79"""

i = 0
for line in in_data.split("\n"):
    i += 1
    print str(i) + " ",
    print shorten(line)
Die 13te Zeile müsste von 0 bis 36 angezeigt werden und die 3te Zeile müsste von 6 bit 36 gehen.

Wie könnte man es korrigieren?
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Eigeninitiative == 0?
Trotzdem aufbauend auf Hyperions ungetesteter Vorarbeit:

Code: Alles auswählen

def shorten(row, vallimit=79, rowlimit=29):
    values = map(int, row.strip().split(','))
    # positionen (nicht im String, sondern in der Werteliste!)
    start = stop = 0
    # zustand merken
    in_seq = False
    for index, val in enumerate(values):
        if val >= vallimit:
            if not in_seq:
                start = index
                in_seq = True
        elif in_seq:
            stop = index
            in_seq = False
            if stop - start > rowlimit:
                return start, stop - 1
    if in_seq and index + 1 - start > rowlimit:
        return start, index
Ausgabe

Code: Alles auswählen

1  (0, 29)
2  (3, 32)
3  (6, 35)
4  (3, 35)
5  (0, 35)
6  None
7  None
8  (6, 35)
9  (3, 32)
10  None
11  None
12  None
13  (0, 35)
MfG
HWK

Edit: Der Ansatz mit der Regex war zwar auf die Grenze von 79 fixiert, sah doch sonst aber ganz nett aus. Hier die Anpassung:

Code: Alles auswählen

def shorten(row):
    result = re.search(r'((?:(?:\d{3,}|79|[89][0-9]),){30,})', row.rstrip() + ',')
    if result:
        return result.start(1) / 3, result.end(1) / 3 - 1
Edit2: Noch eine wohl eher ineffektive Variante zur Demonstration von itertools.groupby:

Code: Alles auswählen

def shorten(row, vallimit=79, rowlimit=29):
    values = map(int, row.strip().split(','))
    result = groupby(values, lambda x: x >= vallimit)
    start = 0
    for k, r in result:
        length = len(list(r))
        if k and length > rowlimit:
            return start, start + length - 1
        start += length
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke es funktioniet.
Antworten