Joinen (matchen) von Listen ??

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
tejste
User
Beiträge: 10
Registriert: Montag 1. Dezember 2008, 17:52

Guten Tag,

Vielen Dank für die Tipps die ich (Anfänger) hier finde.
Allerdings habe ich jetzt ein Problem für das ich noch keine Lösung im Forum gefunden habe.

Wäre super wenn mir jemand helfen könnte.

Ich habe eine Textdatei in der Datensätze [r1,z1,78,b1 <Zeilenumbruch> r2,z2,99,b2 <Zeilenumbruch> …..<Zeilenumbruch> r800,z800,987,b800] enthalten sind. Einer dieser Werte und zwar der dritte soll durch einen anderen Wert ersetzt werden. Dieser andere Wert steht in einer anderen Textdatei die so aussieht [bla1,xx1,99,mmmm1 <Zeilenumbruch> bla2,xx2,78,mmmm2…] Die „78“ als Beispiel aus der ersten Datei ist der Schlüssel und dieser soll durch das „mmmm2“ in der 2. Datei ersetzt werden. Der fertige Datensatz soll so ausehen [r1,z1,mmmm2,b1].

Anschliessen soll das ganze Zeug als Datei abgespeichert werden, aber das sollte ich selbst hinbekommen.

Ich jetzt beide Dateien eingelesen, ich habe beide „line“ separiert und gesplittet. Anschliessend versuche ich das joinen. Aber da joint leider nix.

Code: Alles auswählen


g=open(r"c:\results.csv","r")
datei = g.readlines()


g.close()

for splitten in datei:
    splitten = line.split(";")


instr=open(r"c:\instruments.csv","r")
instrDatei = instr.readlines()

instr.close()

for lines in instrDatei:
    splitinstr = line.split(";")

#joinen

m = splitten[3]

outputdatei=[]

for n in range(1,len(datei)):
    for datei[n]in datei:
        for k in range(1,len(instrDatei)):
            for instrDatei[k] in instrDatei:
                if m in splitinstr[3]:
                    z=datei[n].join(splitinstr[4])
outputdatei.append(z)   

[code=]
[/code]

alles läuft durch aber die outputdatei ist leer. Hat irgendeiner eine Idee
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Ein dict wäre hier eine sinnvollere Datenstruktur für die Instrumente.

Code: Alles auswählen

instruments = dict()
with open(r"c:\instruments.csv") as fo:
    for line in fo:
        parts = line.split(";")
        instruments[int(parts[2])] = parts[3]

result = list()
with open(r"c:\results.csv") as fo:
    for line in fo:
        fields = line.split(";")
        fields[2] = instruments.get(int(fields[2]), 'Unknown Instrument')
        result.append(fields)
Code wie immer ungetestet. Aber ungeachtet dessen hast du Fehler in Zeile 28 und 30. Die ergeben keinen Sinn.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Diese Schleifen sehen ziemlich wüst aus. Ich habe hier mal einen anderen Ansatz. Zuerst sammele ich in einem Dictionary die Ersetzungsregeln, dann baue ich die Liste mit den Ergebnissen direkt beim Einlesen um.

Code: Alles auswählen

instruments = {}
with open("./instruments.csv") as fi:
    for line in fi:
        data = line.strip().split(",")
        instruments[data[2]] = data[3]
print(instruments)

results = []
with open("./results.csv") as fr:
    for line in fr:
        data = line.strip().split(",")
        results.append([data[0], 
                        data[1], 
                        instruments.get(data[2], data[2]), 
                        data[3]])
print(results)
edit: hmpffff ... 5 Minuten zu spät und dann noch das zu aufwändige append ... dafür allerdings code getestet ;-)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ich dachte erst du hättest abgeschrieben :)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

jbs hat geschrieben:Ich dachte erst du hättest abgeschrieben :)
Das zeigt zumindest deutlich, dass erfahrene Software-Entwickler (wobei ich das "erfahren" bei mir in Bezug auf Python etwas einschränken möchte) häufig bei der Lösung einer Aufgabe zu ziemlich ähnlichen Ergebnissen kommen.

Anschließend wird man dann von SCO verklagt ...
tejste
User
Beiträge: 10
Registriert: Montag 1. Dezember 2008, 17:52

das sind minimalistische Ansätze, ich muss wohl noch eine Menge lernen.

das werde ich heute mittag mal ausprobieren und vor allem ich werde mal beide Lösungen testen, auch auf Performance hin. (die Dateien sind ziemlich gross 10.000 und 8000 Datensätze)
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Das kannst du dir sparen: Mes und meine Lösungen haben eine Komplexität von O(n+m). Deine hat O(n*m).
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

tejste hat geschrieben:das werde ich heute mittag mal ausprobieren und vor allem ich werde mal beide Lösungen testen, auch auf Performance hin. (die Dateien sind ziemlich gross 10.000 und 8000 Datensätze)
"Ziemlich groß" ist was anderes. Ich habe das hier mal mit der 10fachen der von dir angegebenen Menge an Datensätzen ausprobiert. Das Skript braucht auf einem ziemlichen alten Laptop keine Sekunde dafür.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

tejste hat geschrieben:...
(die Dateien sind ziemlich gross 10.000 und 8000 Datensätze)
Ja, groß ist was anderes, weder Speicher noch Laufzeit dürften kritisch werden mit dem Instrumenten-Dictionary (8000) und einer result-Liste von 10000 Einträgen, sofern die Datensätze nicht viel größer sind, als von Dir oben beschrieben. (Zumindest scheinen die Datensätze nicht ganz Deiner Beschreibung zu entsprechen, da Du nach ";" splittest ;) )
Alternativ könntest Du noch das Einsammeln der result-Einträge sparen und direkt rausschreiben.

Noch ein Wort zum CSV, solange Du garantieren kannst, dass in den csv-Dateien nur simple Feldwerte vorkommen, liefert Deine Vorgehensweise das gewünschte Ergebnis, sollten aber komplexere Feldwerte existieren (z.B. mit Zeilenumbrüchen oder Delimiter im Feldtext) kracht das händische Splitten der Datensätze. Dann doch lieber das [mod]csv[/mod]-Modul benutzen.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@tejste: Der Code, den Du hier gepostet hast, ist bei Dir aber nicht wirklich gelaufen? Wo kommt z.B. line her?
MfG
HWK
tejste
User
Beiträge: 10
Registriert: Montag 1. Dezember 2008, 17:52

ich habe nur das wesentliche gepostet, als Einsteiger lasse ich mir die Zwischenergebnisse immer anzeigen. Das habe ich mich nicht getraut zu posten :oops:

Dann sind die Datensätze um einiges länger. Die Result tabelle hat pro Datenzeile 60 Werte die Instrumenten Tabelle knapp 80 Werte.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@OP Du solltest die vielleicht mal PEP 8 anschaun. (Oder die deutsche Uebersetzung in meiner Signatur.)
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

tejste hat geschrieben:Dann sind die Datensätze um einiges länger. Die Result tabelle hat pro Datenzeile 60 Werte die Instrumenten Tabelle knapp 80 Werte.
Gerade dann macht es Sinn, nur die gesuchten Werte zwischen zu speichern und den Rest weg zu werfen.
Bottle: Micro Web Framework + Development Blog
tejste
User
Beiträge: 10
Registriert: Montag 1. Dezember 2008, 17:52

anyhow... hat funktioniert

ich habe den Code von DEVnull minimal ändern müssen, und das Ergebnis ist genau das was ich haben wollte.

Allerdings muss ich zugeben das mir diese Python Denkweise noch ziemlich unlogisch erscheint. :x

Vielen Dank
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

tejste hat geschrieben: Allerdings muss ich zugeben das mir diese Python Denkweise noch ziemlich unlogisch erscheint.
Unlogisch? Welcher Schritt erscheint dir denn unlogisch?
Bottle: Micro Web Framework + Development Blog
tejste
User
Beiträge: 10
Registriert: Montag 1. Dezember 2008, 17:52

ist nicht böse gemeint,

das hier zum Beispiel

fields[2] = instruments.get(fields[2], 'Unknown Instrument')

ich hätte hier eine If Schleife genommen. Dann dieses "get" - kannte ich bisher überhaupt nicht, nur aus dem Java. Beides in Kombination verursacht zumindest bei mir schon Kopfschmerzen :roll:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

tejste hat geschrieben:ist nicht böse gemeint,

das hier zum Beispiel

fields[2] = instruments.get(fields[2], 'Unknown Instrument')

ich hätte hier eine If Schleife genommen. Dann dieses "get" - kannte ich bisher überhaupt nicht, nur aus dem Java. Beides in Kombination verursacht zumindest bei mir schon Kopfschmerzen :roll:
ARGHHHHHHHHH
Was meinst Du mit Kopfschmerzen? Ist doch einfach zu verstehen, oder nicht?

Generell solltest Du evtl. mal das Tutorial durcharbeiten und ab und an in die Dokumentation gucken.
Antworten