2016-09-27 3 views
0

Ich versuche, eine einfache Praxis Testfrage zu lösen:bestellt Wörterbuch und Sortierung

  • nur die Zeilen finden, wo der Benutzer vor dem 6. September begann 2010:

    die CSV-Datei Parse

  • .
  • Als nächstes, um die Werte aus den „Worten“ Spalte in aufsteigender Reihenfolge (von Startdatum)
  • Return die kompilierte „versteckt“ Phrase

Die CSV-Datei enthält 19 Spalten und 1000 Datenzeilen. Die meisten davon sind irrelevant. Wie das Problem angibt, geht es nur darum, die Spalte start_date in aufsteigender Reihenfolge zu sortieren, um das zugehörige Wort aus der Spalte "words" zu erhalten. Zusammen ergeben die Wörter die "versteckte" Phrase.

Die Daten in der Quelldatei sind im UTC-Zeitformat, also musste ich sie konvertieren. Ich bin jetzt an dem Punkt, wo ich denke, dass ich die richtigen Zeilen ausgewählt habe, aber ich habe Probleme beim Sortieren der Daten.

Hier ist mein Code:

import csv 
from collections import OrderedDict 
from datetime import datetime 


with open('TSE_sample_data.csv', 'rb') as csvIn: 
    reader = csv.DictReader(csvIn) 
    for row in reader: 

     #convert from UTC to more standard date format 
     startdt = datetime.fromtimestamp(int(row['start_date'])) 
     new_startdt = datetime.strftime(startdt, '%Y%m%d')   

     # find dates before Sep 6th, 2010 
     if new_startdt < '20100906': 

      # add the values from the 'words' column to a list 
      words = [] 
      words.append(row['words']) 

      # add the dates to a list 
      dates = [] 
      dates.append(new_startdt) 

      # create an ordered dictionary to sort the dates... this is where I'm having issues 
      dict1 = OrderedDict(zip(words, dates)) 
      print dict1 
      #print list(dict1.items())[0][1] 
      #dict2 = sorted([(y,x) for x,y in dict1.items()]) 
      #print dict2 

Als ich print dict1 erwarte ich mit den Worten eines geordneten Wörterbuch haben, und die Daten als Elemente enthalten. Stattdessen bekomme ich mehrere geordnete Wörterbücher für jedes erstellte Schlüssel/Wert-Paar.

+1

Das nächste Mal Gummiente Debuggen behebt es, einfach poste nicht. Es ist unwahrscheinlich, dass jemand anderes das nützlich finden wird. – jonrsharpe

+0

Ja, natürlich würdest du! Es wäre super hilfreich gewesen * speziell für dich *. Mein Punkt ist, dass es * nur * speziell für dich nützlich ist. Wie würde eine andere Person mit dem gleichen Problem das finden oder Ihre Antwort verwenden, um ihr Problem zu lösen, es sei denn, sie schreiben * fast genau den gleichen Code *? Es geht darum, qualitativ hochwertige Fragen und Antworten zu erstellen, siehe [Tour]. Ich weiß es zu schätzen, dass du dich anstrengst, und ich bin froh, dass du dein Problem gelöst hast, aber das macht das nicht nützlich. – jonrsharpe

Antwort

0

Hier ist die korrigierte Version:

import csv 
from collections import OrderedDict 
from datetime import datetime 


with open('TSE_sample_data.csv', 'rb') as csvIn: 
    reader = csv.DictReader(csvIn) 
    words = [] 
    dates = [] 
    for row in reader: 

     #convert from UTC to more standard date format 
     startdt = datetime.fromtimestamp(int(row['start_date'])) 
     new_startdt = datetime.strftime(startdt, '%Y%m%d')   

     # find dates before Sep 6th, 2010 
     if new_startdt < '20100906': 

      # add the values from the 'words' column to a list 
      words.append(row['words']) 
      # add the dates to a list 
      dates.append(new_startdt) 

    # This is where I was going wrong! Had to move the lines below outside of the for loop 
    # Originally, because I was still inside the for loop, I was creating a new Ordered Dict for each "row in reader" that met my if condition 
    # By doing this outside of the for loop, I'm able to create the ordered dict storing all of the values that have been found in tuples inside the ordered dict 
    # create an ordered dictionary to sort by the dates 
    dict1 = OrderedDict(zip(words, dates)) 
    dict2 = sorted([(y,x) for x,y in dict1.items()]) 

    # print the hidden message 
    for i in dict2: 
     print i[1] 
+0

Und diese Antwort ist völlig nutzlos. Es gibt keine Erklärung dafür, was das Problem war, was Sie geändert haben oder wie diese Änderungen es lösen. Auch wenn Sie feststellen, dass Sie einen trivialen Fehler gemacht haben, können Sie davon ausgehen, dass dies kein nützliches Q & A für SO sein wird. – jonrsharpe

Verwandte Themen