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
jank
User
Beiträge: 9
Registriert: Sonntag 19. Februar 2012, 17:01

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ß
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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

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.
In specifications, Murphy's Law supersedes Ohm's.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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)
the more they change the more they stay the same
jank
User
Beiträge: 9
Registriert: Sonntag 19. Februar 2012, 17:01

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
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

jank hat geschrieben: Das Ergebnis lautet:
['tl111017']

['tll111017', 'tll111018', 'tll111019']
Dem String in der ersten Liste fehlt ein "l" damit es passt.
jank
User
Beiträge: 9
Registriert: Sonntag 19. Februar 2012, 17:01

@ /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
Antworten