aide exploitation table de donnees

aide exploitation table de donnees - Python - Programmation

Marsh Posté le 08-04-2014 à 17:48:18    

Bonjour, je suis débutante en programmation et on nous a demandé de traiter un fichier texte de type:
A1 B1 0.2
A2 B3 0.6
A3 B3 0.0
A3 B5 0.1
A1 B2 0.5  
A5 B4 0.9
A6 B8 0.1
A7 B1 0.0
A2 B4 0.0
 
Le but est de rendre une liste ou un dictionnaire qui donnera les couples A-B lorsqu'à la fois A et B sont unique, ainsi que, lorsque A ou B est doublé, sélectionne le couple pour lequel on a la plus petite valeur.  
J'ai réussi à selectionner les couples lorsque A est unique ou appartient au plus faible, mais je ne sais pas comment m'y prendre pour selectionner les B ensuite. D'autant que je suis sûre que j'ai plein de données inutiles dans mon programme. Pour l'instant, ça ressemble à ça:
 
# fonction de comparaison
def ortho (m):
 ort1 = {}
 ortb = {}
 ortho = {}
 test = []
 testb = []
 c=0
 x=0
 y=0
 lb2=0
 lb1=0
 lignes=len(m)
 colonnes=len(m[0])
 #on parcourt la liste des gènes A  
 for lignes in range(0, len(m)):
  A=m[lignes][0]
  c=c+1
  if c<(len(m)):
   if A in test:
    y=lignes
    if x != y:
     if m[x][2]<m[y][2]:
      ort1[m[x][0]] = lignes
     else:
      ort1[m[y][0]] = lignes
    #print 'test A dans test'
    #print lignes
   else:
    test.append(A)
    ort1[m[x][0]] = lignes
    x=lignes
    #print 'enregistrer A'
    #print lignes
  #print A
  #print lignes
  #parmis les genes selectionnes on verifie les B uniques:
 for values in ort1.values():
  B=m[values][1]
  if B in testb:
   lb2=lignes
   #comparaison des evalues des deux associations de B:
   if m[lb1][2]<m[lb2][2]:
    ortho[m[lb1][0]]=m[lb1][1]
   else:
    ortho[m[lb2][0]]=m[lb2][1]
  else:
   testb.append(B)
   ortb[m[lb1][0]]=m[lb1][1]
  ortb[m[values][0]]= m[values][1]
 return (ort1, ortb, ortho)
m = lire('tab')
print ortho(m)
 
 
normalement (j'ai traitée les données à la main), si le programme était correct, je devrais obtenir dans ortho les couples (A3-B3, A6-B8, A7-B1 et A2-B4), mais je n'obtient que le dernier, A2-B4.  
Donc, si quelqu'un avait une idée d'où j'ai fais des erreurs et saurait ce qui est complètement inutile... je serais très reconnaissante. Merci d'avance!


Message édité par eryalk9 le 08-04-2014 à 18:07:26
Reply

Marsh Posté le 08-04-2014 à 17:48:18   

Reply

Marsh Posté le 08-04-2014 à 20:10:35    

Oui en effet, je pense que les dictionnaires sont une bonne solution, surtout pour un affichage plus facilement gérable.
 
Voilà une solution:
 

Code :
  1. def getKeyText(f):
  2.     result = {}
  3.     for line in f:
  4.         a, b, key = line.split()
  5.         if key not in result:
  6.             result[key] = [(a, b)]
  7.         else:
  8.             result[key].append((a, b))
  9.     return result
  10. def displayResult(myResult):
  11.     keys = sorted([key for key in myResult])
  12.     for k in keys:
  13.         print(k)
  14.         for res in myResult[k]:
  15.             a, b = res
  16.             print('\t{a} {b}'.format(a=a, b=b))
  17. with open('test.txt', 'r') as f:
  18.     r = getKeyText(f)
  19.     displayResult(r)


 
Le rendu est sympa
 
fred1599@fred1599-Aspire-5741G:~$ python3 test.py
0.0
 A3 B3
 A7 B1
 A2 B4
0.1
 A3 B5
 A6 B8
0.2
 A1 B1
0.5
 A1 B2
0.6
 A2 B3
0.9
 A5 B4


Message édité par fred1599 le 08-04-2014 à 20:12:01
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed