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.
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

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

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

@.robert: Bei Deiner Lösung entstehen neue Zeilen; ich glaube das war nicht gewünscht. (Daher bei mir 2 Listen)
Ronnie
User
Beiträge: 73
Registriert: Sonntag 21. März 2004, 17:44

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]
Achtung: User ist ein Python-Lehrling!
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

@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 ;-)
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: 141
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: 3555
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...
Antworten