2010-07-29 5 views
-1

voici mon code!question de syntaxe débutant python

import csv 
import collections 
import pdb 

def do_work(): 
    (data,counter)=get_file('thefile.csv') 
    b=samples_subset1(data,counter,'/pythonwork/samples_subset4.csv',1) 
    medications_subset2(b,['BUPRENORPHINE']) 

def write_file(data,filename): 
    with open(filename,'wb') as outfile: 
    writer=csv.writer(outfile) 
    for row in data: 
     writer.writerow(row) 

def get_file(start_file): 
    with open(start_file,'rb') as f: 
    data=list(csv.reader(f)) 
    counter=collections.defaultdict(int) 

    for row in data: 
     counter[row[10]]+=1 
    return (data,counter) 

def samples_subset1(data,counter,output_file,sample_cutoff): 
    b_counter=0 
    b=[] 
    for row in data: 
    if counter[row[10]]>=sample_cutoff: 
     b.append(row) 
     b_counter+=1 
    write_file(b,output_file) 
    return b 

def medications_subset2(b,drug_input): 

    brand_names={'MORPHINE':['ASTRAMORPH','AVINZA','CONTIN','DURAMORPH','INFUMORPH', 
        'KADIAN','MS CONTIN','MSER','MSIR','ORAMORPH', 
        'ORAMORPH SR','ROXANOL','ROXANOL 100'], 
     'OXYCODONE':['COMBUNOX','DIHYDRONE','DINARCON','ENDOCET','ENDODAN', 
         'EUBINE','EUCODAL','EUKODAL','EUTAGEN','OXYCODONE WITH ACETAMINOPHEN CAPSULES', 
         'OXYCODONE WITH ASPIRIN,','OXYCONTIN','OXYDOSE','OXYFAST','OXYIR', 
         'PANCODINE','PERCOCET','PERCODAN','PROLADONE','ROXICET', 
         'ROXICODONE','ROXIPRIM','ROXIPRIN','TECODIN','TEKODIN', 
         'THECODIN','THEKOKIN','TYLOX'], 
     'OXYMORPHONE':['NUMORPHAN','OPANA','OPANA ER'], 
     'METHADONE':['ALGIDON','ALGOLYSIN','AMIDON','DEPRIDOL','DOLOPHINE','FENADONE', 
         'METHADOSE','MIADONE','PHENADONE'], 
     'BUPRENORPHINE':['BUPRENEX','LEPTAN','SUBOXONE','SUBUTEX','TEMGESIC'], 
     'HYDROMORPHONE':['DILAUDID','HYDAL','HYDROMORFAN','HYDROMORPHAN','HYDROSTAT', 
          'HYMORPHAN','LAUDICON','NOVOLAUDON','OPIDOL','PALLADONE', 
          'PALLADONE IR','PALLADONE SR'], 
     'CODEINE':['ACETAMINOPHEN WITH CODEINE','ASPIRIN WITH CODEINE','EMPIRIN WITH CODEINE', 
        'FLORINAL WITH CODEINE','TYLENOL 3','TYLENOL 4','TYLENOL 5'], 
     'HYDROCODONE':['ANEXSIA','BEKADID','CO-GESIC','CODAL-DH','CODICLEAR-DH', 
         'CODIMAL-DH','CODINOVO','CONATUSSIN-DC','CYNDAL-HD','CYTUSS-HC', 
         'DETUSSIN','DICODID','DUODIN','DURATUSS-HD','ENDAL-HC','ENTUSS', 
         'ENTUSS-D','G-TUSS','HISTINEX-D','HISTINEX-HC','HISTUSSIN-D','HISTUSSIN-HC', 
         'HYCET','HYCODAN','HYCOMINE','HYDROCODONE/APAP','HYDROKON', 
         'HYDROMET','HYDROVO','KOLIKODOL','LORCET','LORTAB', 
         'MERCODINONE','NOROCO','NORGAN','NOVAHISTEX','ORTHOXYCOL', 
         'POLYGESIC','STAGESIC','SYMTAN','SYNKONIN','TUSSIONEX','VICODIN', 
         'VICOPROFEN','XODOL','ZYDONE']} 

    #pdb.set_trace() 
    c=[] 
    done=False 
    for row in b: 
    done=False  
    for drug in drug_input: 
     for brand in brand_names[drug]:  
     if row[1].upper().find(brand)!=-1: 
      c.append(row) 
      print row[1] 
      done=True 
      break 
     if done: 
     break 

    write_file(c,'/pythonwork/medications_subset3.csv') 
  1. sont mes indentations faciles à lire et conformément aux normes?
  2. Est-ce que je divise le code en fonctions utilisables d'une manière claire et utilisable?
  3. pouvez-vous donner des critiques générales/des conseils sur la façon d'améliorer ma syntaxe?

Merci beaucoup pour votre aide

+10

Veuillez ne poser que des questions spécifiques. Ce n'est pas un site de révision de code. – danben

+2

Utilisez des noms de fonctions significatifs. –

+6

Lisez ceci: http://www.python.org/dev/peps/pep-0008/ – katrielalex

Répondre

5

Premièrement: ce n'est pas un site d'examen du code. Vous devriez avoir une question spécifique. Cela dit, étant donné que le code est ici, je vais commenter.

  • Votre indentation est correcte. C'est un non-problème en Python puisqu'il y a une règle style-guide: quatre espaces.
  • Un autre point de guide de style: les opérateurs tels que = ont besoin d'espaces autour d'eux.
  • Utiliser de meilleurs noms de fonctions et de variables. b est terrible; ça ne donne aucune idée de ce à quoi ça sert. samples_subset1 est seulement légèrement meilleure. Ajouter docstrings et des commentaires partout.
2

Utilisez 4 espaces au lieu de deux.

Commentez votre code.

+0

Ce type de commentaires devrait aller dans les commentaires pas dans les réponses ... –

+0

Vous pouvez utiliser un certain nombre d'espaces ou d'onglets aussi longtemps que c'est cohérent (j'utilise des onglets donc un utilisateur peut définir pour voir 2 espaces et je peux utiliser 4) – Mark

+7

Je ne suis pas d'accord, Teja. Bien que la question de l'OP soit un bon candidat à la clôture, la réponse de Nathan répond spécifiquement aux questions posées. Cette réponse est bien. –

4

Les principales choses qui collent utilisent 4 onglets de l'espace au lieu de deux, l'ajout d'espaces entre les opérateurs (=, ==, +=, <=, etc.), et des commentaires partout. Vos noms de variables doivent également indiquer ce qu'ils contiennent, au lieu de choses telles que b.

Découvrez PEP 8 Style guide pour plus

1

Votre indentation est correcte - bien que non conforme à PEP 8, qui spécifie quatre espaces. Cependant, le code lui-même n'est pas très Pythonic. Les noms de fonctions devraient être plus descriptifs que 'do_work()', et tout le mécanisme de bouclage en bas est très style Java, pas Pythonic.

Il est difficile de donner des zones spécifiques sur lesquelles se concentrer parce que vous n'avez pas commenté le code (un autre doit!), Mais je vous conseille de consulter les listes, les boucles et d'autres mécanismes pour obtenir le résultat désiré .

Conseil: Bien que le code Pythonic devrait toujours être commenté, si elle est trop difficile de comprendre ce qu'est une construction de boucle est censé le faire en regardant le code, il est probablement pas Pythonic.

+0

j'apprécie votre réponse! Pouvez-vous s'il vous plaît me dire comment je changerais ce triple pour que la boucle soit pythonique? –

1

Envisagez d'ajouter une fonction principale. Voir this article pour les directives.

De plus, l'exécution de pylint peut vous aider à améliorer votre code et à le rendre plus pythonique.