Seite 1 von 1

Listen vergleichen?

Verfasst: Mittwoch 22. Februar 2012, 15:12
von jank
Hallo,

habe mit folgendem Code den Inhalt 2er Ordner ausgeben lassen.

Code: Alles auswählen

for ROOT,DIR,FILES in os.walk(Pfad_File + "\\cover"):
 for file in FILES:
  if (file.startswith('l') and file.endswith('shp')):
    file = "tl" + file[1:7] # Dateiendung aus fileliste wird entfernt
    file = file.strip()
    liste1  = [file]
    print liste1

print ""

for ROOT,DIR,FILES in os.walk(Pfad_File):
 for file in FILES:
  if (file.endswith('csv')):
    file = "tl" + file[1:8] # Dateiendung aus fileliste wird entfernt
    file = file.strip()
    liste2  = [file]
    print liste2
Das Ergebnis lautet:
['tl111017']

['tll111017']
['tll111018']
['tll111019']
Der erste Eintrag des Ergebnisses stammt aus der liste 1 und die anderen 3 aus liste2.
Nun möchte ich gern beide Listen so miteinander vergleichen, dass nur die Einträge übrig bleiben, die NICHT in beiden Listen vorkommen.
Das Ergebnis müsste also ['tll111018'] und ['tll111019'] lauten.
Ich bin im Netz über eine Möglichkeit gestoßen, die eine Liste von der anderen zu subtrahieren: ListeNeu = Liste2 - Liste1
Aber das klappt nicht, da das Subtrahieren außerhalb der FOR-Schleifen geschieht und außerhalb der FOR-Schleifen wird ja nicht mehr der komplette Listeninhalt erkannt :-(

Hat jemand ne Idee?

Danke im Voraus!

Gruß

Re: Listen vergleichen?

Verfasst: Mittwoch 22. Februar 2012, 15:34
von /me
jank hat geschrieben:Ich bin im Netz über eine Möglichkeit gestoßen, die eine Liste von der anderen zu subtrahieren: ListeNeu = Liste2 - Liste1
Aber das klappt nicht, da das Subtrahieren außerhalb der FOR-Schleifen geschieht und außerhalb der FOR-Schleifen wird ja nicht mehr der komplette Listeninhalt erkannt :-(
Doch, der komplette Listeninhalt wird erkannt. Dein Problem ist, dass du bei jedem Schleifendurchlauf eine neue Liste an den Namen bindest. Die alten Ergebnisse wirfst du dabei weg. Du musst stattdessen die Ergebnisse zu einer bestehenden Liste hinzufügen.

Code: Alles auswählen

>>> for i in xrange(10):
	data = [i]
>>> print data
[9]
>>> data = []
>>> for i in xrange(10):
	data.append(i)
>>> print data
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Um die Unterschiede zu bekommen kannst du dann mit Sets arbeiten. Das Ergebnis ist wieder ein Set, das du dann bei Bedarf zurück in eine Liste konvertieren kannst.

Code: Alles auswählen

>>> data1 = [1, 2, 3, 4]
>>> data2 = [2, 4, 6, 8]
>>> data1 - data2

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    data1 - data2
TypeError: unsupported operand type(s) for -: 'list' and 'list'
>>> set(data1) - set(data2)
set([1, 3])
Noch eine Anmerkung zum Schluss. Bitte versuche dich nach PEP-8 zu richten und verwende 4 Leerzeichen als Einrückung. Aktuell liest sich das nicht schön.

Noch eine letzte Anmerkung. file ist ein ungünstig gewählter Name für einen Bezeichner, da du damit die eingebaute Funktion file überschreibst.

Re: Listen vergleichen?

Verfasst: Mittwoch 22. Februar 2012, 16:22
von pillmuncher
Was /me gesagt hat.

@jank: Außerdem würde ich es anders machen, als du. Merke: Die Standard-Bibliothek ist dein Freund:

Code: Alles auswählen

import os

pfad_file = '...'

liste1 = []
for root, directory, filenames in os.walk(os.path.join(pfad_file, '\cover')):
    for name in filenames:
        if name.startswith('l'):
            name, ext = os.path.splitext(name)
            if ext == '.shp':
                liste1.append('tl' + name[1:7].strip())

liste2 = []
for root, directory, filenames in os.walk(pfad_file):
    for name in filenames:
        name, ext = os.path.splitext(name)
        if ext == '.csv':
            liste2.append('tl' + name[1:8].strip())

print liste1
print ''
print liste2
print set(liste1).symmetric_difference(liste2)
set.symmetric_difference(sequence) (entsprechend set1 ^ set2) liefert die Elemente, die nur in je einem der sets, aber nicht in beiden vorkommen. Im Gegensatz dazu liefert set.difference(sequence) (entsprechend set1 - set2) diejenigen Elemente, die zwar im ersten, aber nicht im zweiten set vorkommen. Sollte dabei im zweiten ein Element vorhanden sein, welches im ersten nicht vorkommt, so taucht das im Ergebnis nicht auf.

Dein Kommentar # Dateiendung aus fileliste wird entfernt ist übrigens verwirrend, weil du ja auch den ersten Buchstaben ebenfalls abschneidest.

PEP8 ist auch dein Freund.

Gruß,
Mick.

Re: Listen vergleichen?

Verfasst: Donnerstag 23. Februar 2012, 01:13
von Dav1d
Basierend auf pillmunchers Code (ungetestet):

Code: Alles auswählen

import os

def walk_filenames(path):
    for root, directory, filenames in os.walk(path):
        for name in filenames:
            yield name

liste1 = ['tl' + fname[1:7].strip() for fname in walk_filenames(…) if fname.startswith('l') and fname.endswith('.shp')]
liste2 = ['tl' + fname[1:8].strip() for fname in walk_filenames(…) if fname.endswith('.csv')]

print liste1
print ''
print liste2
print set(liste1).symmetric_difference(liste2)

Re: Listen vergleichen?

Verfasst: Donnerstag 23. Februar 2012, 08:35
von jank
Hallo,

danke für die Tipps. Es hakt aber trotzdem an einer Stelle.

Hier der aktuelle Code:

Code: Alles auswählen

liste1 = []
Pfad1 = Pfad_File + "\cover"
#for root, directory, filenames in os.walk(os.path.join(Pfad_File, '\\cover')):
for root, directory, filenames in os.walk(Pfad1):
   for name in filenames:
        if name.startswith('l'):
            name, ext = os.path.splitext(name)
            if ext == '.shp':
                liste1.append('tl' + name[1:7].strip())
liste2 = []
for root, directory, filenames in os.walk(Pfad_File):
    for name in filenames:
        name, ext = os.path.splitext(name)
        if ext == '.csv':
            liste2.append('tl' + name[1:8].strip())

#liste1 = ['tll111017']
print liste1
print ''
print liste2
print ''
print set(liste2).difference(liste1)
Das Ergebnis lautet:
['tl111017']

['tll111017', 'tll111018', 'tll111019']

set(['tll111017', 'tll111019', 'tll111018'])

Es werden also wieder alle 3 aus der 2. Liste gefunden. Es dürfen aber nur 'tll111019', 'tll111018' im Ergebnis stehen.
Wenn ich die Liste 1 statisch erstelle, also #liste1 = ['tll111017'] einkommentiere, klappt es komischerweise ?!?!?!?

Ich denke, dass es nur noch eine Kleinigkeit sein kann.

Danke vorab!

Gruß
Jan

Re: Listen vergleichen?

Verfasst: Donnerstag 23. Februar 2012, 09:12
von /me
jank hat geschrieben: Das Ergebnis lautet:
['tl111017']

['tll111017', 'tll111018', 'tll111019']
Dem String in der ersten Liste fehlt ein "l" damit es passt.

Re: Listen vergleichen?

Verfasst: Donnerstag 23. Februar 2012, 09:22
von jank
@ /me

seit 2 stunden probiere ich hin und her und mir fiel nicht das kleine "l" auf :-(
in der zweiten zeile müssen die "l" weg; so ist es richtig

wenn man den wald vor lauter bäumen nicht sieht...

danke nochmal