2016-09-08 2 views
0

Ich mache ein Projekt, in dem ich Daten aus drei verschiedenen Datensätzen extrahiere und sie kombiniere, um Kampagnenbeiträge zu betrachten. Dazu habe ich die relevanten Daten aus zwei Sets in Wörterbücher (canDict und otherDict) mit ID-Nummern als Schlüssel und den Informationen, die ich benötige (Parteizugehörigkeit), als Werte umgesetzt. Dann schrieb ich ein Programm, um Parteinformation basierend auf dem Schlüssel zu ziehen (mein drittes Set enthielt auch diese ID-Nummern) und passte sie mit dem Arbeitgeber der spendenden Partei und dem gespendeten Betrag zusammen. Das war eine langatmige Erklärung, aber ich dachte, es würde helfen, diesen Code zu verstehen.Kompilieren eines Wörterbuchs durch Ziehen von Daten aus anderen Wörterbüchern

Mein Problem ist, dass mein drittes Wörterbuch (ArbeitgeberDict) aus irgendeinem Grund nicht kompiliert wird. Am Ende dieses Schritts sollte ich ein Wörterbuch mit Arbeitgebern als Schlüssel und eine Liste von Tupeln als Werte haben, aber nach dem Ausführen bleibt das Wörterbuch leer. Ich bin schon ein Dutzend Mal über diese Linie gegangen und ziehe mir die Haare aus - ich kann nicht für das Leben von mir denken, warum es nicht funktioniert, was es schwierig macht, nach Antworten zu suchen. Ich habe fast jede Zeile kommentiert, um zu versuchen, es aus dem Zusammenhang heraus zu verstehen. Kann jemand meinen Fehler finden?

Update: habe ich einen Zähler, n, auf den äußersten for-Schleife, wenn das Programm zu sehen, wurde überhaupt laufen.

Update 2: Ich fügte hinzu, eine weitere if-Anweisung bei der Erstellung der Variablen party, die ID an Daten im Fall [0] in canDict oder in otherDict nicht existierte. Ich habe auch einige bereits vorgeschlagene Korrekturen aus den Kommentaren hinzugefügt.

n=0 
with open(path3) as f:       # path3 is a txt file 
    for line in f: 
     n+=1 
     if n % 10000 == 0: 
      print(n) 
     data = line.split("|")     # Splitting each line into its entries (delimited by the symbol |) 
     party = canDict.get(data[0])   # data[0] is an ID number. canDict and otherDict contain these IDs as keys with party affiliations as values 
     if party is None: 
      party = otherDict[data[0]]   # If there is no matching ID number in canDict, search otherDict 
      if party is None: 
       party = 'Other' 
     else: 
      print('ERROR: party is None') 
     x = (party, int(data[14]))    # Creating a tuple of the the party (found through the loop) and an integer amount from the file path3 
     employer = data[11]     # Index 11 in path3 is the employer of the person 
     if employer != '': 
      value = employerDict.get(employer) # If the employer field is not blank, see if this employer is already a key in employerDict 
      if value is None: 
       employerDict[employer] = [x] # If the key does not exist, create it and add a list including the tuple x as its value 
      else: 
       employerDict[employer].append(x) # If it does exist, add the tuple x to the existing value 
     else: 
      print('ERROR: employer == ''') 
+0

Mein Bauchgefühl ist 'Arbeitgeber! = '' 'Bewertet immer zu falsch. Versuchen Sie 'print (Arbeitgeber! = '')' Vor der zweiten if-Anweisung. –

+2

In der fünften Zeile hat 'data [0]' keinen Grund, 'None' zu ​​sein (kommt von' split'). Deine fünfte Zeile sollte also "falls Party ist keine:" sein. –

+0

@AndrewJenkins Danke für die Idee, aber kein Glück:/Ich fügte auch einen Zähler nur um zu sehen, ob es überhaupt iterierte (siehe Update) und das ist auch eine Ausgabe von Null – boop

Antwort

0

Danke für alle Eingabe jeder - aber es sieht aus wie ein Problem mit meiner Datendatei, kein Problem mit dem Programm. Dangit.

0

Angenommen, wir vereinfachen und neu ordnen die Dinge ein wenig:

import sys 
from collections import defaultdict 

employerDict = defaultdict(list) 

ID, EMPLOYER, AMOUNT = 0, 11, 14 

with open(path3) as f: # path3 is a *.txt file 

    for n, line in enumerate(f): 
     if n % 10000 == 0: 
      print(n) 

     data = line.rstrip().split('|') # Splitting each line into its entries 

     employer = data[EMPLOYER] # the employer of the person 

     if employer == '': # verify that you get 'employer' occasionally! 
      print("ERROR: employer == ''", file=sys.stderr) 
      continue 

     id_string = data[ID] # is ID always a string or is it an int (e.g. in other dicts)? 

     # If there is no matching ID number in canDict, search otherDict 
     party = canDict.get(id_string, otherDict.get(id_string, 'Other')) 

     # Create a tuple of the the party (found through the loop) and an integer amount from the file path3 
     x = (party, int(data[AMOUNT])) 

     employerDict[employer].append(x) # Add the tuple x to the (automatically) existing list 

Does diese Hilfe?

+0

Danke für die Korrektur - es hat auch nicht funktioniert, was meinem Verdacht, dass es ein Problem mit meiner Datendatei oder meiner Python-Konsole ist, eher als dem Programm, zusätzlichen Beweis gibt. Ein bisschen mehr experimentieren wird zeigen was! Vielen Dank! – boop

Verwandte Themen