(gelöst)Unerwünschte Zeichen aus einer Liste entfernen

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.
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

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
Zuletzt geändert von Schaf220 am Freitag 26. September 2008, 16:50, insgesamt 2-mal geändert.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Deine liste ist so erstmal keine Liste, sondern ein Tupel mit Listen drin ... :wink:

Und: Zeig doch mal deinen Code.

Und: Was sind "Zahlenumbrüche"? :lol:

Und: Alle Einsen weg, Zahlen > 1 sollen bleiben, richtig?
Benutzeravatar
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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
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.
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Ja ich weiss es ist aber leider eine Aufgabe die ich lösen muss.
Deswegen komme ich da nicht drum herum :(
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Code: Alles auswählen

print ''.join(char + (str(num) if num > 1 else '') for char, num in liste)
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

könntest du mir die Zeile Code bitte erklären? Ich bin mir auch nicht sicher ob das alle in eine Zeile kommt?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

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
Zuletzt geändert von audax am Dienstag 26. August 2008, 18:36, insgesamt 2-mal geändert.
BlackJack

@audax: Du hast die Zeilenumbrüche vergessen:

Code: Alles auswählen

print ''.join(char + (str(num) if num > 1 else '')
              for char, num in liste if char != '\n')
@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()`.
Benutzeravatar
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
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Könntet ihr mir vielleicht auch noch zeigen wie ich die Zeichen wieder hinzufüge?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Jetzt bist du schon wiederholt nach DEINEM Code gefragt worden - gezeigt hast du noch nichts.
Benutzeravatar
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:

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)

mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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. :(
Sowas?

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
BlackJack

@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.
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

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.
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 =)
Gruß Schaf220
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

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 :-)
Benutzeravatar
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
BlackJack

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".
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Ja das habe ich jetzt verstanden danke nochmal für deine Hilfe.
Antworten