Zwei Listen vergleichen

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.
Antworten
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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ß
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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])
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

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)
In specifications, Murphy's Law supersedes Ohm's.
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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.
Zuletzt geändert von Herr Lehmann am Sonntag 15. August 2010, 10:35, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Wie gesagt, den Error konnte ich selbst beheben, aber das vergleichen mit sets scheint nicht richtig zu funktionieren
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Stimmt. Du müßtest die "readlines()"-Methode auf dem File-Objekt nehmen - sofern Dein Dateiformat aus einem Link in genau einer Zeile besteht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Herr Lehmann
User
Beiträge: 81
Registriert: Samstag 14. August 2010, 22:20

Jetzt gehts, vielen vielen Dank!!!
Antworten