2016-09-27 1 views
0

J'essaie de résoudre une question de simple test pratique:Ordonné Dictionnaire et tri

Parse le fichier CSV:

  • Trouver uniquement les lignes où l'utilisateur a commencé avant le 6 Septembre, 2010 .
  • Ensuite, commander les valeurs de la colonne « mots » dans l'ordre croissant (par date de début)
  • Retour à la compilation phrase « cachée »

Le fichier csv a 19 colonnes et 1000 lignes de données. La plupart d'entre eux ne sont pas pertinents. Comme l'indique le problème, nous ne sommes concernés que par le tri de la colonne start_date dans l'ordre croissant pour obtenir le mot associé à partir de la colonne 'words'. Ensemble, les mots donneront la phrase "cachée".

Les dates dans le fichier source sont au format UTC, donc j'ai dû les convertir. Je suis sur le point maintenant où je pense avoir les bonnes lignes sélectionnées, mais j'ai des problèmes de tri des dates.

Voici mon 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 

Quand je print dict1 je me attends d'avoir un dictionnaire ordonné avec les mots et les dates inclus que des articles. Au lieu de cela, ce que je reçois est plusieurs dictionnaires ordonnés pour chaque paire clé-valeur créée.

+1

La prochaine fois que le débogage de canard en caoutchouc fixe, simplement ne pas poster. Il est peu probable que quelqu'un d'autre trouve cela utile. – jonrsharpe

+0

Oui, bien sûr que vous le feriez! Cela aurait été super utile * spécifiquement pour vous *. Mon point est que c'est * seulement * utile spécifiquement pour vous. Comment une autre personne ayant le même problème trouverait-elle cela, ou utiliserait-elle votre réponse pour résoudre son problème, à moins qu'elle n'écrive * presque exactement le même code *? Le but est de créer des questions et réponses de haute qualité, voir le [tour]. J'apprécie que vous fassiez un effort, et je suis content que vous ayez résolu votre problème, mais cela ne le rend pas utile. – jonrsharpe

Répondre

0

est ici la version corrigée:

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

Et cette réponse est complètement inutile. Il n'a aucune explication sur le problème, ce que vous avez changé ou comment ces changements le résolvent. Encore une fois, quand vous réalisez que vous avez fait une erreur triviale, vous pouvez supposer que ce ne sera pas un Q & A utile pour SO. – jonrsharpe