Seite 1 von 1

Zwei Listen vergleichen

Verfasst: Samstag 14. August 2010, 22:58
von Herr Lehmann
Hallo,

soweit hab ich es: Ich hole mir eine Liste mit Links, die einzeln untereinander stehen und schreibe diese in meine links.txt

jetzt möchte ich, wenn ich das zweite Mal die Liste anfordere, dass er links die noch nicht in der liste stehen anfügt und links die nicht mehr in der Liste stehen mit einem Zusatz nicht_in_liste oder ähnlichem versieht. :K

Ich hoffe die Darstellung des Problems ist klar und ich hoffe mir kann jemand von euch helfen.

Vielen Dank schon mal, dass ihr euch die Zeit genommen habt meinen Beitrag bis zum Ende zu lesen ;)

Gruß

Re: Zwei Listen vergleichen

Verfasst: Samstag 14. August 2010, 23:10
von cofi
Hallo und willkommen im Forum!

Ich denke du suchst `set`s.

Code: Alles auswählen

>>> old = [1,2,3,4]
>>> new = [3,4,5,6]
>>> a = set(old)
>>> b = set(new)
>>> a - b
set([1, 2])
>>> b - a
set([5, 6])
>>> a.update(b)
>>> a
set([1, 2, 3, 4, 5, 6])

Re: Zwei Listen vergleichen

Verfasst: Samstag 14. August 2010, 23:52
von Herr Lehmann
Hallo, danke für deine Antwort. Ich hab das jetzt mal so versucht:

Code: Alles auswählen

neueListe = set(f_temp)

alteListe = set(f_links)

fehlendeUrls = alteListe - neueListe #Da ist schon das erste Problem, weil er die Links die neu dazugekommen sind ja auch als fehlendeUrls speichern würde

alteListe = neueListe - fehlendeUrls

f_links.write(str(alteListe)) # ginge das so mit str weil ohne sagt er mir "argument 1 must be string or read-only character buffer, not set" aber mit str kommt zwar kein error aber in der txt datei steht nur set([])

Ich hoffe ihr könnt mit meinen momentan etwas wirren Gedankengängen etwas anfangen ;)

Gruß

edit: Hab noch etwas gegoogelt und ich denke ich brauche exakt sowas:
cmpfiles( dir1, dir2, common[, shallow])
Returns three lists of file names: match, mismatch, errors. match contains the list of files match in both directories, mismatch includes the names of those that don't, and errros lists the names of files which could not be compared. Files may be listed in errors because the user may lack permission to read them or many other reasons, but always that the comparison could not be done for some reason.
Nur eben nicht für Verzeichnisse sondern für den Inhalt von Dateien.

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 08:46
von pillmuncher

Code: Alles auswählen

neueListe = set(f_temp)
alteListe = set(f_links)

alt_und_neu = alteListe & neueListe
alt_aber_nicht_neu = alteListe - neueListe
neu_aber_nicht_alt = neueListe - alteListe
& soll eigentlich & sein, aber das wird zwischen code-Tags nicht richtig angezeigt.

Du willst file.writelines():

Code: Alles auswählen

some_set = set()
... # some_set befüllen
some_file.writelines(some_set)

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 10:05
von Herr Lehmann
Hallo,

danke für die hilfe. Nur jetzt bekomme ich einen komischen error:

Code: Alles auswählen

 neueListe = set(f_temp)
IOError: [Errno 9] Bad file descriptor
Edit, habe es Selbst gelöst. Man muss die Dateien mit r+w öffnen nicht mit rw

edit 2:

Code: Alles auswählen

ulLinks = resp.read()
f_temp.write(ulLinks)

neueListe = set(f_temp)
alteListe = set(f_links)
alt_und_neu = alteListe & neueListe
alt_aber_nicht_neu = alteListe - neueListe
neu_aber_nicht_alt = neueListe - alteListe

print alt_aber_nicht_neu
f_links.close()

f_links = open('links.txt','w+r')
f_links.write(ulLinks)

f_links.close()
f_temp.close()
f_down.close()
So hab ichs allerdings sind alt_aber_nicht_neu Irgendwelche links die auf jeden fall sowohl in der alten als auch in der neuen liste vorkommen.

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 10:09
von Hyperion
Der Fehler kommt wirklich exakt durch die Zeile, die Du da gepostest hast? Wa sist denn f_temp für ein Typ? Evtl. ein File-Object? Evtl. eines, welches bereits wieder geschlossen wurde?

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 10:59
von Herr Lehmann
Wie gesagt, den Error konnte ich selbst beheben, aber das vergleichen mit sets scheint nicht richtig zu funktionieren

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 11:05
von Hyperion
Abgesehen davon, dass der Code ziemlich wirr aussieht, vergleichst Du da File-Objekte und nicht den Inhalt der Dateien!

Schreib Dir doch dazu Funktionen und gliedere die auf:
- eine Funktion zum Einlesen beliebiger Dateien, die eine Liste (oder eben gleich ein Set) von den Links zurückliefert
- dann rufst Du die eben mit den beiden betroffenen Dateien auf und führst die oben geschilderten Mengenoperationen auf den Rückgabewerten aus

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 11:37
von Herr Lehmann
eine Funktion zum Einlesen beliebiger Dateien, die eine Liste (oder eben gleich ein Set) von den Links zurückliefert
Könntest das konkretisieren, habe leider noch nicht soviel Erfahrung in Python

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 11:45
von BlackJack
@Herr Lehmann: In der Python-Dokumentation gibt es ein Tutorial, welches man mal durchgearbeitet haben sollte.

Und dann kannst Du auch mal ``print`` verwenden um Annahmen zu überprüfen. Lass Dir zum Beispiel nach ``neueListe = set(f_temp)`` mal `neueListe` ausgeben und vergleiche was Du bekommst, mit dem was Du wohl erwartet hast.

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 11:46
von Hyperion
Z.B. so:

Code: Alles auswählen

def load(filename):
    with open(filename, "r") as infile:
        return infile.read()

def main():
    old_links = set(load("old_links.txt"))
    new_links = set(load("old_links.txt"))
    # ab hier kannst Du dann die Vergleiche durchführen
Zum Speichern kannst Du dann ggf. auch eine solche Funktion schreiben.

Generell stellen sich mir noch die Fragen:
Wieso eigentlich gibt es mehr als "eine" Datei? Wenn Du doch so etwas wie einen Crawler hast, könntest Du doch direkt gegen die zuvor persistenten daten vergleichen. Wozu der Umweg über das Speichern der Daten in eine neue Datei?

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 12:05
von Herr Lehmann
Generell stellen sich mir noch die Fragen:
Wieso eigentlich gibt es mehr als "eine" Datei? Wenn Du doch so etwas wie einen Crawler hast, könntest Du doch direkt gegen die zuvor persistenten daten vergleichen. Wozu der Umweg über das Speichern der Daten in eine neue Datei?
Z.B. so:
Generell stellen sich mir noch die Fragen:
Wieso eigentlich gibt es mehr als "eine" Datei? Wenn Du doch so etwas wie einen Crawler hast, könntest Du doch direkt gegen die zuvor persistenten daten vergleichen. Wozu der Umweg über das Speichern der Daten in eine neue Datei?
Genau das ist mir gerade auch aufgefallen... Ich bastel mal noch ein bißchen rum, vielen Dank für die Denkanstöße.

Gruß

P.S. Ich bin von Python wirklich begeistert nur irgendwie vermisse ich sowas wie die Java API wo ich nachlesen kann, welche Mehtoden mit welchen Parameter aufgerufen werden können.

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 12:09
von Hyperion
Herr Lehmann hat geschrieben: P.S. Ich bin von Python wirklich begeistert nur irgendwie vermisse ich sowas wie die Java API wo ich nachlesen kann, welche Mehtoden mit welchen Parameter aufgerufen werden können.
http://docs.python.org/

Ich hoffe die Seite kanntest Du?

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 12:21
von Herr Lehmann
Ja danke nochmal für den Hinweis.. habe nicht genau genug geguckt.

Zu meinem Prblem, wenn ich es so mache wie du vorschlägst:
old_links = set(load("old_links.txt"))
dann bekomme ich bei einem print old_links : set(['\n', '-', '/', '.', '1', '0', '3', '2', '5', '4', '7', '6', '9', '8', ':', 'A', 'C', 'B', 'E', 'D', 'G', 'F', 'I', 'H', 'K', 'J', 'M', 'L', 'O', 'N', 'P', 'S', 'R', 'U', 'T', 'W', 'V', 'Z', '_', 'a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h', 'k', 'j', 'm', 'l', 'o', 'n', 'q', 'p', 's', 'r', 'u', 't', 'w', 'v', 'y', 'x', 'z'])

Das kann doch so nicht richtig sein.

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 12:24
von Hyperion
Stimmt. Du müßtest die "readlines()"-Methode auf dem File-Objekt nehmen - sofern Dein Dateiformat aus einem Link in genau einer Zeile besteht.

Re: Zwei Listen vergleichen

Verfasst: Sonntag 15. August 2010, 12:29
von Herr Lehmann
Jetzt gehts, vielen vielen Dank!!!