2017-08-15 3 views
0

Je suis nouveau sur python. J'ai un problème, et je suis coincé. L'information est enregistrée dans un certain nombre de dictionnaires. la variable pos est un float dans le fichier, mais python le lit comme une chaîne. Je suppose que c'est pourquoi lorsque la fonction compare_positions est appelée, je reçois ce message d'erreur:Coercition de valeurs de dictionnaire dans les flottants

Traceback (most recent call last): 
File "anotherPythontry.py", line 167, in <module> 
    iterate_thru(Genes,c,maxp,p) 
File "anotherPythontry.py", line 133, in iterate_thru 
    compare_positions(test_position,maxp,sn,g,p,c) 
File "anotherPythontry.py", line 103, in compare_positions 
    elif (testpos > maxpos and testpos <= maxpos+1): 
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 

J'ai essayé de faire pos, testpos, maxpos flotteurs, mais je me TypeError: float() argument must be a string or a number. Je ne suis pas sûr du problème.

Voici le code:

def hasher(): 
     return collections.defaultdict(hasher) 

Positions = hasher() 
LODs = hasher() 
whole_line = hasher() 
InCommon = hasher() 

def save_info(line): 
    lod = line[7] 
    chr = line[2] 
    pos = line[3] #is a float in the file. Is read as a string though 
    snp = line[1] 
    item = line[10] 
    together = '\t'.join(line) 
    whole_line[item][snp]=together 
    Positions[item][chr][snp]= pos 
    LODs[item][chr][snp]=lod 
    return snp, item 

with open(sys.argv[3],"r") as geneFile: 
    gsnp_list = list() 
    Genes = [] 
    for line in geneFile: 
      line = line.strip().split("\t") 
      type1 = line[0] 
      if "SNP_id" or "Minimum" not in line: 
        if type1 == match: 
          snp,item = save_info(line) 
          gsnp_list.append(snp) 
          if item not in Genes: 
            Genes.append(item) 
# A similar block of code is for another file with phenotypes 

def compare_positions(testpos,maxsnp,gs,gene,p,c): 
    maxpos = Positions[p][c].get(maxsnp) 
    if testpos == maxpos: 
      InCommon[p][c][maxsnp][gene].append(gs) 
    elif (testpos > maxpos and testpos <= maxpos+1): 
      InCommon[p][c][maxsnp][gene].append(gs) 
    elif (testpos < maxpos and testpos >= maxpos-1): 
      InCommon[p][c][maxsnp][gene].append(gs) 

def iterate_thru(Genelist,c,maxp,p): 
    for g in Genelist: 
      for sn in Positions[g][c].keys(): 
        test_position = Positions[g][c].get(sn) 
        compare_positions(test_position,maxp,sn,g,p,c) 

for g in Genes: 
    for c in Positions[g].keys(): 
      chr_SNPlist =() 
      chr_SNPlist = [snp for snp in gsnp_list if snp == Positions[g][c].keys()] 
      maxp = get_max(chr_SNPlist,g,c) 
      iterate_thru(Phenos,c,maxp,g) 

Merci à l'avance.

Répondre

1

Le problème est dans cette ligne:

test_position = Positions[g][c].get(sn) 

La demande donnée est pas dans le dictionnaire, le retour None suite qui ne peut être comparé à un nombre entier. Cette valeur est ensuite passée à la méthode compare_positions où la comparaison est effectuée qui a abouti à votre erreur.

En fonction de votre application, vous pouvez essayer une valeur par défaut, comme zéro:

test_position = Positions[g][c].get(sn, 0) 
+0

Merci pour votre réponse. Je n'ai pas ajouté tout le code auparavant. Comme vous pouvez le voir 'test_position = Positions [g] [c] .get (sn)' devrait être dans le dictionnaire parce que je suis itérer par ses clés dans la fonction 'iterate_thru'. Dans la fonction 'save_info', le dictionnaire devrait subir une autovivification. – NewbieDoo

+0

Si la clé est dans le dictionnaire, la valeur de cette clé doit être None. Cela pourrait fonctionner 'test_position = Positions [g] [c] .get (sn) ou 0' où la valeur zéro sera retournée si None est la valeur de cet emplacement clé. – Alexander