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.
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
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