2010-03-05 6 views
1

J'ai deux fichiers et le contenu est le suivant:différence calcul dans les listes

alt text http://img144.imageshack.us/img144/4423/screencapture2b.png

alt text http://img229.imageshack.us/img229/9153/screencapture1c.png

S'il vous plaît considérer que la colonne et la colonne en gras rouge. Le texte restant est indésirable et inutile. Comme il ressort des deux fichiers, ils sont similaires à bien des égards. J'essaie de comparer le texte en gras dans file_1 et file_2 (ce n'est pas en caractères gras mais j'espère que vous pouvez faire ressortir que c'est la même colonne) et s'ils sont différents, je veux imprimer le texte rouge de file_1. J'ai atteint ceci par le script suivant:

import string 
import itertools 

chain_id=[] 
for file in os.listdir("."): 
    basename = os.path.basename(file) 
    if basename.startswith("d.complex"): 
     chain_id.append(basename) 

for i in chain_id: 
    print i 
    g=codecs.open(i, encoding='utf-8') 

    f=codecs.open("ac_chain_dssp.dssp", encoding='utf-8') 
    for (x, y) in itertools.izip(g, f): 
      if y[11]=="C": 
       if y[35:38]!= "EN": 
        if y[35:38] != "OTE": 
         if x[11]=="C": 
          if x[12] != "C": 
           if y[35:38] !=x[35:38]: 
            print x [7:10] 


    g.close() 
    f.close() 

Mais les résultats que j'ai obtenus n'étaient pas ce que j'attendais. Maintenant, je veux modifier le code ci-dessus de telle sorte que lorsque je compare la colonne en gras, si la différence entre les valeurs est supérieure à 2, alors il doit imprimer les résultats. Par exemple, la ligne-1 de la colonne en gras dans le fichier_1 est 83 et dans le fichier_2 elle est 84 puisque la différence entre les deux est inférieure à deux, je veux qu'elle soit rejetée.

Quelqu'un peut-il m'aider à ajouter le code restant? Vive, Chavanak

PS: Ce n'est pas devoirs :)

Répondre

2

La réponse à votre question est de modifier la dernière condition,
if y[35:38] !=x[35:38]: de sorte qu'au lieu du « champ » à [35:38] converties en int (ou flotter ...) et une différence peut être appliqué à eux. Donner quelque chose comme

try: 
    iy = int(y[35:38]) 
    ix = int(x[35:38]) 
    except ValueError: 
    # here for whatever action is appropriate, including silent ignoring. 
    print("Unexpected value for record # %s" % x[7:10]) 

    if abs(ix - iy) > 2: 
    print(x[7:10]) 

Plus indirectement, l'extrait de code dans la question invite les remarques suivantes, qui peuvent à leur tour proposer des différentes approches du problème.

  • Tout d'abord, si les fichiers sont strictement « format fixe », si elles sont très grandes, et/ou si rien d'autre se fait avec l'une des autres valeurs « champs » trouvés dans le fichier, l'approche actuelle est valide et probablement très efficace. En variante, la logique peut être rendue plus résiliente aux variations possibles dans la structure de fichier, etc., en analysant les "champs" du fichier, plutôt que de les traiter comme des tranches d'une longue chaîne. Loot dans le module csv de la bibliothèque standard pour un support possible de l'analyseur.
  • certains tests semblent goofy/always true etc (comme comparer une tranche de 3 caractères à un littéral de chaîne de 2 caractères.En plus d'être logiquement erroné, ceci indique aussi une solution plus "analysée" où une telle erreur logique est plus facilement évitée ou plus évidente.
0

Je n'ai pas compris votre problème, mais bien

Fichier 1

100 C 20.2 
300 B 33.3 

Fichier 2

110 C 20.23 
320 B 33.34 

et vous voulez comparer la 3e colonne des deux f iles.

lines1 = file1.readlines() 
list1 = [float(line.split()[2]) for line in lines1] # list of 3rd column values 

lines2 = file2.readlines() 
list2 = [float(line.split()[2]) for line in lines2] 

result = map(lambda x,y: x-y < 2,list1,list2) 

OU

result = [list1[i]-list2[i] for i in range(len(list1)) if list1[i] - list2[i] > 2] 

Est-ce ce que vous voulez ??

+0

'2437' est le bon nombre premier !!! –

+0

Comment peut-il être ce qu'il veut? Ses colonnes de données sont FIXED-WIDTH et la 5ème colonne contient des entrées vides. L'utilisation de str.split() sur ses données va créer un désordre. Sa colonne en caractères gras concerne la colonne NEUVIÈME - je ne vois pas d'où vous obtenez trois colonnes contiguës. –

+0

Je n'ai pas remarqué ça. Merci. J'aurais dû utiliser le tranchage. +1 à votre bonne réponse: D. J'ai aussi mentionné que je n'ai pas complètement compris la question. –

2

Rien à voir avec votre problème, mais ceci:

 if y[11]=="C": 
      if y[35:38]!= "EN": 
# I don't see any "EN" or "OTE" anywhere in your sample input. 
# In any case the above condition will always be true, because 
# y[35:38] appears to be a 3-byte string but "EN" is a 2-byte string. 
       if y[35:38] != "OTE": 
        if x[11]=="C": 
         if x[12] != "C": 
          if y[35:38] !=x[35:38]: 
           print x [7:10] 

est ummmmm ...

Vous voudrez peut-être envisager une autre façon d'expression par exemple

if (x[11] == "C" == y[11] 
and x[12] != "C" 
and y[35:38] not in ("EN?", "OTE") 
and y[35:38] != x[35:38]): 
    print x[7:10] 
+0

Merci pour le conseil :) Le code a l'air propre et soigné :) – forextremejunk

Questions connexes