(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:

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

Beitragvon Schaf220 » Dienstag 26. August 2008, 17:52

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

Beitragvon numerix » Dienstag 26. August 2008, 18:02

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:

Beitragvon Schaf220 » Dienstag 26. August 2008, 18:12

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

Beitragvon numerix » Dienstag 26. August 2008, 18:17

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:

Beitragvon Schaf220 » Dienstag 26. August 2008, 18:23

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

Beitragvon audax » Dienstag 26. August 2008, 18:23

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:

Beitragvon Schaf220 » Dienstag 26. August 2008, 18:25

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

Beitragvon audax » Dienstag 26. August 2008, 18:28

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

Beitragvon BlackJack » Dienstag 26. August 2008, 18:29

@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:

Beitragvon Schaf220 » Dienstag 26. August 2008, 18:35

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:

Beitragvon Schaf220 » Dienstag 26. August 2008, 18:49

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

Beitragvon numerix » Dienstag 26. August 2008, 18:57

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:

Beitragvon Schaf220 » Dienstag 26. August 2008, 19:07

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)

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

Re: Unerwünschte Zeichen aus einer Liste entfernen, aber wie

Beitragvon mitsuhiko » Dienstag 26. August 2008, 20:51

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

Beitragvon BlackJack » Dienstag 26. August 2008, 21:16

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder