Seite 2 von 2

Verfasst: Dienstag 9. März 2010, 13:50
von Hyperion
.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?

Verfasst: Dienstag 9. März 2010, 14:14
von .robert
@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...

Verfasst: Dienstag 9. März 2010, 14:21
von Hyperion
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)

Verfasst: Mittwoch 10. März 2010, 00:42
von karolus
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

Verfasst: Mittwoch 10. März 2010, 09:45
von .robert
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:

Verfasst: Mittwoch 10. März 2010, 13:07
von mit
@.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]?

Verfasst: Mittwoch 10. März 2010, 13:18
von /me
mit hat geschrieben:@karolus: Deine Lösung scheint zu funktionieren, aber was bedeutet die [89]?
Das ist hier Teil eines regulären Ausdrucks.

Verfasst: Mittwoch 10. März 2010, 13:34
von Hyperion
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.

Verfasst: Mittwoch 10. März 2010, 14:43
von mit
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?

Verfasst: Mittwoch 10. März 2010, 15:12
von 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.

Verfasst: Mittwoch 10. März 2010, 15:32
von Dav1d
Wobei man bei gute Editoren / IDE's die Einrückung in Leerzeichen pro Tab einstellen kann

Verfasst: Donnerstag 11. März 2010, 10:21
von mit
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?

Verfasst: Donnerstag 11. März 2010, 15:20
von Hyperion
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.

Verfasst: Freitag 12. März 2010, 11:19
von mit
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.

Verfasst: Freitag 12. März 2010, 14:12
von Hyperion
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...

Verfasst: Freitag 12. März 2010, 14:57
von mit
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?

Verfasst: Freitag 12. März 2010, 15:56
von HWK
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

Verfasst: Mittwoch 17. März 2010, 11:58
von mit
Danke es funktioniet.