Hallöchen mal wieder,
mein heutiges Problem ist, das ich eine Liste habe, die so aussieht:
liste = [['E', 27], ['a', 1], ['b', 1], ['c', 1], ['d', 1], ['\n', 1]]
Jetzt möchte ich die Klammern "[]" , die Zeilenumbrüche und die Einsen entfernen, so das nur noch "E27abcd" da steht, das schwierige ist, dass sich
die Zahl hinter den Zeilenumbrüchen noch erhöhen kann aber trotzdem sollen sie weg. Ich hab es schon mit remove versucht aber ich bin auf kein Ergebnis gekommen.
Wie kann ich das am besten lösen liebe Community?
Gruß Schaf220
(gelöst)Unerwünschte Zeichen aus einer Liste entfernen
- Schaf220
- User
- Beiträge: 113
- Registriert: Montag 11. August 2008, 16:00
- Wohnort: Bremen
- Kontaktdaten:
Ich hatte 2 Fehler im Text sorry dafür, jetzt sind Sie weg.
Also ich arbeite an einem Komprimierer der zum Beispiel eine txt Datei einliest z.B. "EEEEEEEEEEEEEEEEEEEEEEEEEEEabcd" jetzt fasst mein Code dies in eine Liste mit Listen zusammen. Aus EEEEE.... wird [E, 27] und so weiter. Danach schreibt er eine neue Datei, die darf nachtürlich nicht größer sein als die Originaldatei sein xD logisch oder? Deswegen müssen alle überflüssigen Zeichen raus.
Also ich arbeite an einem Komprimierer der zum Beispiel eine txt Datei einliest z.B. "EEEEEEEEEEEEEEEEEEEEEEEEEEEabcd" jetzt fasst mein Code dies in eine Liste mit Listen zusammen. Aus EEEEE.... wird [E, 27] und so weiter. Danach schreibt er eine neue Datei, die darf nachtürlich nicht größer sein als die Originaldatei sein xD logisch oder? Deswegen müssen alle überflüssigen Zeichen raus.
Also, wenn es wirklich um eine Datei mit (lesbarem) Text geht, dann dürfte dein Komprimierer eher schwach komprimieren, im Normalfall wird das Ergebnis exakt soviel Byte haben, wie das Original, weil es doch kaum Wörter gibt, wo mehr als zweimal der gleiche Buchstabe aufeinanderfolgt (naja, Kunststofffenster vielleicht) und bei Doppelung bringt deine Kompression gar nichts.Schaf220 hat geschrieben:Ich hatte 2 Fehler im Text sorry dafür, jetzt sind Sie weg.
Also ich arbeite an einem Komprimierer der zum Beispiel eine txt Datei einliest z.B. "EEEEEEEEEEEEEEEEEEEEEEEEEEEabcd" jetzt fasst mein Code dies in eine Liste mit Listen zusammen. Aus EEEEE.... wird [E, 27] und so weiter. Danach schreibt er eine neue Datei, die darf nachtürlich nicht größer sein als die Originaldatei sein xD logisch oder? Deswegen müssen alle überflüssigen Zeichen raus.
Code: Alles auswählen
print ''.join(char + (str(num) if num > 1 else '') for char, num in liste)
Du punktest am Besten im Unterricht, wenn du einfach die zlib nimmst:
http://docs.python.org/lib/module-zlib.html
€dit:
Der Code funzt übrigens.
Generator Expressions
'string'.join()
foo if True else bar
http://docs.python.org/lib/module-zlib.html
€dit:
Der Code funzt übrigens.
Generator Expressions
'string'.join()
foo if True else bar
Zuletzt geändert von audax am Dienstag 26. August 2008, 18:36, insgesamt 2-mal geändert.
@audax: Du hast die Zeilenumbrüche vergessen:
@Schaf220: Wenn das Hausaufgaben sind, dann solltest Du zumindest zeigen was Du versucht hast, und wo Du *konkret* nicht weiter kommst.
Als Tipp: Nicht aus der vorhandenen Liste entfernen, sondern eine neue, ohne die unerwünschten Elemente erstellen. Das ist einfacher und in der Regel auch schneller als `remove()`.
Code: Alles auswählen
print ''.join(char + (str(num) if num > 1 else '')
for char, num in liste if char != '\n')
Als Tipp: Nicht aus der vorhandenen Liste entfernen, sondern eine neue, ohne die unerwünschten Elemente erstellen. Das ist einfacher und in der Regel auch schneller als `remove()`.
- Schaf220
- User
- Beiträge: 113
- Registriert: Montag 11. August 2008, 16:00
- Wohnort: Bremen
- Kontaktdaten:
Das mit der neuen Liste is gut!
Das Problem habe ich so beschrieben das man es versteht oder nich?
Ich möchte einfach die störenden Zeichen entfernen aber ich weiss leider nicht wie ich das anstelle.
Vielen Dank für die Lösung
Das Problem habe ich so beschrieben das man es versteht oder nich?
Ich möchte einfach die störenden Zeichen entfernen aber ich weiss leider nicht wie ich das anstelle.
Vielen Dank für die Lösung
- Schaf220
- User
- Beiträge: 113
- Registriert: Montag 11. August 2008, 16:00
- Wohnort: Bremen
- Kontaktdaten:
Was wollt Ihr da sehen ich hab nur eine txt Datei eingelesen und gepackt.
Der Code sieht jetzt so aus:
Der Code sieht jetzt so aus:
Code: Alles auswählen
data_list = []
import sys
from optparse import OptionParser
#Parser
parser = OptionParser()
parser.add_option("-r", "--read", dest = "read",
help="File that will be read",
metavar="FILE")
parser.add_option("-c", "--compress", dest="compress",
help="File will be compress",
metavar="FILE")
parser.add_option("-u", "--uncompress", dest="uncompress",
help="liste wird angezeigt",
metavar="FILE")
parser.add_option("-e", "--extension", dest="extension",
help="add your own extension",
metavar="FILE")
parser.add_option("-q", "--quiet", dest="quiet",
help="programm will be quiet")
(options, args) = parser.parse_args()
def packer(data):
pack_list = []
number = 1
place = ""
for i in data:
if i != place:
pack_list.append([i,number])
else:
pack_list[-1][1] += 1
place = i
return pack_list
def write_file(final_list):
try:
if options.extension:
new_file = file("rld"+"." + options.extension, "w")
else:
new_file = file("rld"+".rld", "w")
for word in final_list:
new_file.write(str(word))
new_file.close()
except StandardError, why:
print ("Speichern nicht moeglich!"), why
if options.read:
try:
compressfile = open(options.read, "r") # open the named file
line = compressfile.readline() # read one line of the file
while(line): # while there are lines
for element in line:
change = changer(element)
data_list.append(change) # continue to read the lines and
line = compressfile.readline() # append the signs to a list
compressfile.close() # close the file
except StandardError, why: # standard error exception
print "StandardError:", why
except:
print "Could not read file!"
print data_list
elif (options.compress and options.extension) or options.compress:
change = ""
try:
compressfile = open(options.compress, "r") # open the named file
line = compressfile.readline() # read one line of the file
while(line): # while there are lines
for element in line:
change = changer(element)
data_list.append(element) # continue to read the lines and
line = compressfile.readline() # append the signs to a list
compressfile.close() # close the file
except StandardError, why: # standard error exception
print "StandardError:", why
except:
print "Could not read file!"
pack_file = packer(data_list)
print pack_file
change_file = ''.join(char + (str(num) if num > 1 else '')
for char, num in pack_file if char != '\n')
write = write_file(change_file)
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
Sowas?Schaf220 hat geschrieben:Hallöchen mal wieder,
mein heutiges Problem ist, das ich eine Liste habe, die so aussieht:
liste = [['E', 27], ['a', 1], ['b', 1], ['c', 1], ['d', 1], ['\n', 1]]
Jetzt möchte ich die Klammern "[]" , die Zeilenumbrüche und die Einsen entfernen, so das nur noch "E27abcd" da steht, das schwierige ist, dass sich
die Zahl hinter den Zeilenumbrüchen noch erhöhen kann aber trotzdem sollen sie weg. Ich hab es schon mit remove versucht aber ich bin auf kein Ergebnis gekommen.
Code: Alles auswählen
>>> liste = [['E', 27], ['a', 1], ['b', 1], ['c', 1], ['d', 1], ['\n', 1]]
>>> from itertools import chain, imap
>>> ''.join(imap(str, (x for x in chain(*liste) if x not in ('\n', 1))))
'E27abcd'
TUFKAB – the user formerly known as blackbird
@Schaf220: Nun ja jetzt sehen wir, dass Du einfach nur eine Lösung kopiert hast und nicht selber entwickelt hast.
Die vorhandenen Kommentare kannst Du alle entfernen, die erzählen ja nur das nun wirklich Offensichtliche, was da schon als Quelltext daneben steht. Generell sollten Kommentare nicht erzählen *was* gemacht wird, das sollte schon aus dem Quelltext ersichtlich sein, sondern *warum* das im Quelltext so gemacht wird, wie es gemacht wird.
Den Quelltext auf Modulebene würde ich in einer `main()`-Funktion verschwinden lassen.
Die Kommandozeilen-API ist etwas ungewöhnlich und es gibt auch verschiedene Datentypen. `--quiet` sollte zum Beispiel eher ein `bool` sein. Da eigentlich immer die Namen für Ein- und Ausgabedatei benötigt wird, die also nicht *optional* sind, sollten das auch keine Optionen sondern Argumente sein. Bleibt eine Option, die angibt, ob ge- oder entpackt werden soll. Könnten auch zwei Optionen mit dem gleichen `dest` sein und das jeweils auf `True` oder `False` setzen. Auf jeden Fall sollten falsche Kombinationen auch mit einer Fehlermeldung quittiert werden.
`packer()` sollte `pack()` heissen. Funktionen und Methoden werden in der Regel mit Verben benannt, die beschreiben was sie tun. `Packer` (in dieser Schreibweise) ist eher ein Name für eine Klasse. `number` ist nur ein Name für den Wert 1 und ändert sich nie. `last_byte` wäre ein passenderer Name für `place` und `i` sollte man in Schleifen nur an ganze Zahlen binden. Alles andere ist sehr verwirrend für Leser.
Man kann Optionen mit einem Defaultwert vorbelegen, damit ist die entsprechende ``if``-Abfrage in `write_file()` überflüssig. Das Argument der Funktion heisst `final_list`, es wird aber *eine* Zeichenkette übergeben. Anstelle der ``for``-Schleife hätte man hier auch die `writelines()`-Methode verwenden können. Macht natürlich auch nur Sinn, wenn man auch wirklich eine Liste bekommt und keine Zeichenkette.
Die ``except``-Anweisungen mit `StandardError` und ohne konkrete Ausnahme sind schlecht. Du machst nirgends mit den Ausnahmen etwas sinnvolles. Ausgegeben werden sie auch, wenn man sie nicht abfängt.
Über Zeilen in einer Datei kann man ganz einfach mit einer ``for``-Schleife iterieren, die ``while``-Konstruktionen sind viel zu kompliziert.
Die Funktion `changer()` ist nirgends definiert.
`write_file()` ist mit jeweils nur 2 Leerzeichen pro Ebene eingerückt.
Die vorhandenen Kommentare kannst Du alle entfernen, die erzählen ja nur das nun wirklich Offensichtliche, was da schon als Quelltext daneben steht. Generell sollten Kommentare nicht erzählen *was* gemacht wird, das sollte schon aus dem Quelltext ersichtlich sein, sondern *warum* das im Quelltext so gemacht wird, wie es gemacht wird.
Den Quelltext auf Modulebene würde ich in einer `main()`-Funktion verschwinden lassen.
Die Kommandozeilen-API ist etwas ungewöhnlich und es gibt auch verschiedene Datentypen. `--quiet` sollte zum Beispiel eher ein `bool` sein. Da eigentlich immer die Namen für Ein- und Ausgabedatei benötigt wird, die also nicht *optional* sind, sollten das auch keine Optionen sondern Argumente sein. Bleibt eine Option, die angibt, ob ge- oder entpackt werden soll. Könnten auch zwei Optionen mit dem gleichen `dest` sein und das jeweils auf `True` oder `False` setzen. Auf jeden Fall sollten falsche Kombinationen auch mit einer Fehlermeldung quittiert werden.
`packer()` sollte `pack()` heissen. Funktionen und Methoden werden in der Regel mit Verben benannt, die beschreiben was sie tun. `Packer` (in dieser Schreibweise) ist eher ein Name für eine Klasse. `number` ist nur ein Name für den Wert 1 und ändert sich nie. `last_byte` wäre ein passenderer Name für `place` und `i` sollte man in Schleifen nur an ganze Zahlen binden. Alles andere ist sehr verwirrend für Leser.
Man kann Optionen mit einem Defaultwert vorbelegen, damit ist die entsprechende ``if``-Abfrage in `write_file()` überflüssig. Das Argument der Funktion heisst `final_list`, es wird aber *eine* Zeichenkette übergeben. Anstelle der ``for``-Schleife hätte man hier auch die `writelines()`-Methode verwenden können. Macht natürlich auch nur Sinn, wenn man auch wirklich eine Liste bekommt und keine Zeichenkette.
Die ``except``-Anweisungen mit `StandardError` und ohne konkrete Ausnahme sind schlecht. Du machst nirgends mit den Ausnahmen etwas sinnvolles. Ausgegeben werden sie auch, wenn man sie nicht abfängt.
Über Zeilen in einer Datei kann man ganz einfach mit einer ``for``-Schleife iterieren, die ``while``-Konstruktionen sind viel zu kompliziert.
Die Funktion `changer()` ist nirgends definiert.
`write_file()` ist mit jeweils nur 2 Leerzeichen pro Ebene eingerückt.
- Schaf220
- User
- Beiträge: 113
- Registriert: Montag 11. August 2008, 16:00
- Wohnort: Bremen
- Kontaktdaten:
Also um das mal Klar zustellen Black Jack den Code hab ich selbst geschrieben und nicht alle funktionen hier reingestellt, wie zum Beispiel Changer und die Lösung die ihr mir gegeben habt werde ich auch verwenden ich dachte das darf ich oder etwa nicht? Ich werde den User oder besser gesagt die Quelle auf jeden Fall angeben der Rest des Codes ist von mir, also nicht irgentwo geklaut. Der Code ist auch noch lange nicht fertig mir fehlt ja noch der Entpacker den werde ich in der nächsten zeit noch coden =)BlackJack hat geschrieben:@Schaf220: Nun ja jetzt sehen wir, dass Du einfach nur eine Lösung kopiert hast und nicht selber entwickelt hast.
Die vorhandenen Kommentare kannst Du alle entfernen, die erzählen ja nur das nun wirklich Offensichtliche, was da schon als Quelltext daneben steht. Generell sollten Kommentare nicht erzählen *was* gemacht wird, das sollte schon aus dem Quelltext ersichtlich sein, sondern *warum* das im Quelltext so gemacht wird, wie es gemacht wird.
Den Quelltext auf Modulebene würde ich in einer `main()`-Funktion verschwinden lassen.
Die Kommandozeilen-API ist etwas ungewöhnlich und es gibt auch verschiedene Datentypen. `--quiet` sollte zum Beispiel eher ein `bool` sein. Da eigentlich immer die Namen für Ein- und Ausgabedatei benötigt wird, die also nicht *optional* sind, sollten das auch keine Optionen sondern Argumente sein. Bleibt eine Option, die angibt, ob ge- oder entpackt werden soll. Könnten auch zwei Optionen mit dem gleichen `dest` sein und das jeweils auf `True` oder `False` setzen. Auf jeden Fall sollten falsche Kombinationen auch mit einer Fehlermeldung quittiert werden.
`packer()` sollte `pack()` heissen. Funktionen und Methoden werden in der Regel mit Verben benannt, die beschreiben was sie tun. `Packer` (in dieser Schreibweise) ist eher ein Name für eine Klasse. `number` ist nur ein Name für den Wert 1 und ändert sich nie. `last_byte` wäre ein passenderer Name für `place` und `i` sollte man in Schleifen nur an ganze Zahlen binden. Alles andere ist sehr verwirrend für Leser.
Man kann Optionen mit einem Defaultwert vorbelegen, damit ist die entsprechende ``if``-Abfrage in `write_file()` überflüssig. Das Argument der Funktion heisst `final_list`, es wird aber *eine* Zeichenkette übergeben. Anstelle der ``for``-Schleife hätte man hier auch die `writelines()`-Methode verwenden können. Macht natürlich auch nur Sinn, wenn man auch wirklich eine Liste bekommt und keine Zeichenkette.
Die ``except``-Anweisungen mit `StandardError` und ohne konkrete Ausnahme sind schlecht. Du machst nirgends mit den Ausnahmen etwas sinnvolles. Ausgegeben werden sie auch, wenn man sie nicht abfängt.
Über Zeilen in einer Datei kann man ganz einfach mit einer ``for``-Schleife iterieren, die ``while``-Konstruktionen sind viel zu kompliziert.
Die Funktion `changer()` ist nirgends definiert.
`write_file()` ist mit jeweils nur 2 Leerzeichen pro Ebene eingerückt.
Gruß Schaf220
Ich denke nicht das es hier um copyright oder sowas geht sondern eher darum das die Leute im Forum nicht Deine Hausaufgaben machen wollen.
Es geht einfach nur darum das man nicht einfach sagt ich hab etwas versucht und bekomm es nicht hin, sondern das man auch zeigt was man versucht hat....
Ist zumindest das was ich immer interpretiere, wenn ich sowas gefragt werd, was hin und wieder mal vorkommt
Es geht einfach nur darum das man nicht einfach sagt ich hab etwas versucht und bekomm es nicht hin, sondern das man auch zeigt was man versucht hat....
Ist zumindest das was ich immer interpretiere, wenn ich sowas gefragt werd, was hin und wieder mal vorkommt
- Schaf220
- User
- Beiträge: 113
- Registriert: Montag 11. August 2008, 16:00
- Wohnort: Bremen
- Kontaktdaten:
Ach so is das gemeint, in diesem Fall möchte ich mich bei Black Jack entschuldigen, ich hab den Code von euch schon eingefügt gehabt als ich ihn ins Forum kopierte. Ich weiss ja nicht wie hier manche User es handhaben, aber ich hab nicht nur ne lösung verlangt, weil ich kein Bock auf meine Hausaufgaben habe. Ich hab es versucht und kam wirklich nicht weiter dann bekam ich den neuen Code und hab ihn natürlich ausprobiert.
Das nächste mal wenn ich Hilfe brauche dann gebe ich auch den bereits vorhandenen Code.
Gruß Schaf220
Das nächste mal wenn ich Hilfe brauche dann gebe ich auch den bereits vorhandenen Code.
Gruß Schaf220
Ich denke es hat niemand etwas dagegen, wenn Du die Quelltextstückchen verwendest, es ging mir eher darum, dass es *Dir* nicht allzuviel bringt, wenn Du das tust ohne sie zu verstehen.
Copyright ist bei diesen kleinen Code-Häppchen sowieso nicht gegeben, da fehlt wohl die "Schöpfungshöhe".
Copyright ist bei diesen kleinen Code-Häppchen sowieso nicht gegeben, da fehlt wohl die "Schöpfungshöhe".