Seite 1 von 2

Verfasst: Dienstag 9. März 2010, 13:32
von .robert
Das prinzip mal eben in ganz scheiße und oberflächlich zusammengehackt:

Code: Alles auswählen

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\n
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\n
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\n
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\n
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\n
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\n
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\n
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\n
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\n
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\n
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\n
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\n
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\n
"""
in_data = in_data.split('\n')

out_data = []

for line in in_data:
    line = line.split(',')
    b = []
    for i in line:
        if i and int(i)>= 79:
            b.append(i)
        elif len(b)>=29:
            out_data.append(b)
            b = []

print out_dat
das schön zu machen ist deine aufgabe

Verfasst: Dienstag 9. März 2010, 13:36
von Hyperion
So als Schnellschuss:

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))
Evtl. könnte man das mit itertools eleganter lösen. Aber dafür hatte ich grad keine Zeit :-)

Ist jetzt nur für eine Zeile; das einzubauen überlasse ich mal dem OP.

Verfasst: Dienstag 9. März 2010, 13:38
von Hyperion
@.robert: Bei Deiner Lösung entstehen neue Zeilen; ich glaube das war nicht gewünscht. (Daher bei mir 2 Listen)

Verfasst: Dienstag 9. März 2010, 13:39
von Ronnie
So wie ich es verstanden habe: kein Werte kleiner 79 und min. 30 Werte je Zeile:

Code: Alles auswählen

>>> lines = """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"""
>>> limit = 79
>>> minlen = 30
>>> filtered = [items for items in [[int(v) for v in line.split(",") if int(v) >= limit] for line in lines.split("\n") if len(line) > 0] if len(items) > minlen]

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

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...