web-dev-qa-db-fra.com

comment sortir d'une seule boucle imbriquée

J'ai deux fichiers séparés par des tabulations et je dois tester chaque ligne du premier fichier par rapport à toutes les lignes de l'autre fichier. Par exemple,

fichier1:

row1    c1    36    345   A
row2    c3    36    9949  B
row3    c4    36    858   C

fichier2:

row1    c1    3455  3800
row2    c3    6784  7843
row3    c3    10564 99302
row4    c5    1405  1563

disons que je voudrais sortir toutes les lignes de (fichier1) pour lesquelles col [3] de fichier1 est plus petit que tout (pas tous) col [2] de fichier2, étant donné que col [1] sont les mêmes.

Production attendue:

row1    c1    36    345   A
row2    c3    36    9949  B

Puisque je travaille dans Ubuntu, je voudrais que la commande d'entrée ressemble à ceci:
python code.py [file1] [file2] > [output]

J'ai écrit le code suivant:

import sys

filename1 = sys.argv[1]
filename2 = sys.argv[2]

file1 = open(filename1, 'r')
file2 = open(filename2, 'r')

done = False

for x in file1.readlines():
    col = x.strip().split()
    for y in file2.readlines():
        col2 = y.strip().split()
        if col[1] == col2[1] and col[3] < col2[2]:
            done = True
            break
        else: continue
print x

Cependant, la sortie ressemble à ceci:

row2    c3    36    9949  B

Cela est évident pour les ensembles de données plus volumineux, mais en gros, je n'ai toujours que la dernière ligne pour laquelle la condition dans la boucle imbriquée était vraie. Je soupçonne que "pause" me fait sortir des deux boucles. Je voudrais savoir (1) comment rompre une seule des boucles for et (2) si c'est le seul problème que j'ai ici.

14
biohazard

break et continue s'appliquent à la boucle la plus intérieure.

Le problème est que vous n'ouvrez le deuxième fichier qu'une seule fois et qu'il n'est donc lu qu'une seule fois. Lorsque vous exécutez for y in file2.readlines(): pour la deuxième fois, file2.readlines() renvoie un itérable vide.

Déplacez file2 = open(filename2, 'r') dans la boucle externe, ou utilisez seek() pour revenir en arrière au début de file2.

23
NPE

Vous devez analyser les chaînes numériques à leurs valeurs entières correspondantes.

Vous pouvez utiliser int('hoge') comme suit.

import sys

filename1 = sys.argv[1]
filename2 = sys.argv[2]

with open(filename1) as file1:
    for x in file1:
        with open(filename2) as file2:
            col = x.strip().split()
            for y in file2:
                col2 = y.strip().split()
                if col[1] == col2[1] and int(col[3]) < int(col2[2]):
                    print x
2
eisoku9618