Zeilen kuerzen
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
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.
Die Ausgabe sieht wie folgt aus:
Was mache ich falsch?
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)
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
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Imho alles! Indem Du nämlich Dinge zu Deiner Aufgabenstellung hinzunimmst, die sich mit der ursprünglichen beißen.mit hat geschrieben:Was mache ich falsch?
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.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Das hättest Du auch mal eher sagen können...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.
Na das ist doch simpelDie Methode sollte nur die Start und Endpostion des gefunden Fragment zurück liefern.
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
Ich bekomme folgende Falsche ausgabe:
mit diesem Test code:
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?
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
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)
Wie könnte man es korrigieren?
Eigeninitiative == 0?
Trotzdem aufbauend auf Hyperions ungetesteter Vorarbeit:AusgabeMfG
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:
Edit2: Noch eine wohl eher ineffektive Variante zur Demonstration von itertools.groupby:
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
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)
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
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