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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

.robert hat geschrieben:@Hyperion: meine "Lösung" ist erst mal nur ein simpler Parser, der Sequenzen mit den gegebenen Bedingungen erkennt und ausgibt.
Ich würde die dann in eine neue Datei schreiben, denke ich, dann gibt es kein Problem mit neuen Zeilen ;-)
Und wie stellst Du fest, welche Elemente von Deinem out_data in EINE Zeile gehören?
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

@Hyperion: die Liste b wird ja bei jeder neuen Zeile zurück gesetzt. Was allerdings nicht bedacht wird, sind Sequenzen, die bis zum Zeilenende gehen.
Aber das kann man ja leicht nachrüsten...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Anders formuliert: Du fügst in Deinem Ergebnis für jede Sequenz von >29 einen neuen Wert in Deiner Ergebnisliste ein. Was machst Du bei mehreren Sequenzen von >29 in einer Zeile?

(eben einen neuen Wert in der Ergebnisliste - das war aber imho nicht gewünscht)
karolus
User
Beiträge: 144
Registriert: Samstag 22. August 2009, 22:34

Hallo
Der Vollständigkeit halber noch eine Lösung mit re.

Code: Alles auswählen

s = """83,80,80,80,80,81,81,81,81,81,81,82,10000,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"""

import re
print '\n'.join(re.findall(r'((?:(?:\d{3,}|79|[89][0-9]),?){30,})', s)).replace(',\n','\n')
Gruß Karo
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Hyperion hat geschrieben:Anders formuliert: Du fügst in Deinem Ergebnis für jede Sequenz von >29 einen neuen Wert in Deiner Ergebnisliste ein.
Ja, da hast du recht. Meine 'Lösung' geht ein wenig an der Aufgabenstellung vorbei.
Hab halt nicht drüber nachgedacht... :wink:
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

@.robert: Warum wird z.b. die letzte Zeile von in_data gelöscht? Wozu brauch man "i and" in der if Anweisung.
Wie könnte man dein Code korigieren?

@Hyperion: Habe dein Code wie folgt erweitert:

Code: Alles auswählen

def shorten(row, vallimit=79, rowlimit=29):
    values = map(int, row.strip().split(","))
    res = []
    tmp = []
    for val in values:
        if val >= vallimit:
            tmp.append(val)
        else:
            if len(tmp) > rowlimit:
                res.extend(tmp)
            tmp = []
    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"""

for line in in_data.split("\n"):
    print shorten(line)
aber warum wird z.B. die letzte Zeile gelöscht. Wie könnte man dein Code korigieren?

@Ronnie: Deine Lösung löscht alle wert kleiner 79 und vergleicht anschließen ob die übrig geblieben Sequenz größer ist als 29. Die 79 ist wie eine grenze wenn ein Wert unterhalb dieser sinkt dann wird die bisdahin gefundene Sequenz geprüft ob diese länger ist als 29. Wenn nicht und der nächste Wert >= 79 ist dann wird der rest Zeile geprüft.

@karolus: Deine Lösung scheint zu funktionieren, aber was bedeutet die [89]?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

mit hat geschrieben:@karolus: Deine Lösung scheint zu funktionieren, aber was bedeutet die [89]?
Das ist hier Teil eines regulären Ausdrucks.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mit hat geschrieben: aber warum wird z.B. die letzte Zeile gelöscht. Wie könnte man dein Code korigieren?
Das Problem ist, dass nach dem Ende der Schleife nicht überprüft wird, was evtl. noch in tmp drin ist. Das müßte man noch mal gegen die Länge 29 prüfen und dann an res anfügen.

Code: Alles auswählen

def shorten(row, vallimit=79, rowlimit=29):
    values = map(int, row.strip().split(","))
    res = []
    tmp = []
    for val in values:
        if val >= vallimit:
            tmp.append(val)
        else:
            if len(tmp) > rowlimit:
                res.extend(tmp)
            tmp = []
    # neu
    if len(tmp) > rowlimit:
        res.extend(tmp)
    if res:
        return ",".join(map(str, res))
Ist nen bisselr unschön... aber auf die schnelle fällt mir nichts besseres ein. Evtl. ist es besser (um den Spezialfall zu verhindern) sich in der Schleife alle Fragmente zu merken und am Schluss einmal nur alle diejenigen zusammenzusetzen, die len() > 29 sind.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Danke, deine Korrektur funktioniert. Habe also versucht es zu verschönern wie du es beschrieben hast bekomme aber diesen Fehler:

Code: Alles auswählen

  File "H.py", line 17
    return ",".join(map(str, res))   
         ^
IndentationError: expected an indented block
Der Code sieht wie folgt aus:

Code: Alles auswählen

def shorten(row, vallimit=79, rowlimit=29):
    values = map(int, row.strip().split(","))
    res = []
    tmp = []
    for val in values:
        if val >= vallimit:
            tmp.append(val)
        else:
			# neu
            res.extend(tmp)
            tmp = []
    # neu
	for i in res:
		if len(i) > rowlimit:
        	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"""

for line in in_data.split("\n"):
	print shorten(line)
Was mache ich falsch?
BlackJack

@mit: Ich glaube das wurde schonmal erwähnt, dass man keine Tabs zum Einrücken verwenden sollte. In der Zeile hast Du Tabs und Leerzeichen vermischt. Da fällt man dann subtil auf die Nase.
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