Подтвердить что ты не робот

Как вырваться из одного вложенного цикла

У меня есть два файла с разделителями табуляции, и мне нужно проверить каждую строку в первом файле по всем строкам в другом файле. Например,

file1:

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

file2:

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

скажем, я хотел бы вывести все строки в файле (file1), для которых col [3] файла1 меньше любого (не каждого) col [2] файла2, учитывая, что col [1] одинаковы.

Ожидаемый результат:

row1    c1    36    345   A
row2    c3    36    9949  B

Так как я работаю в Ubuntu, я бы хотел, чтобы команда ввода выглядела так:
python code.py [file1] [file2] > [output]

Я написал следующий код:

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

Однако вывод выглядит следующим образом:

row2    c3    36    9949  B

Это видно для больших наборов данных, но в основном я всегда получаю только последнюю строку, для которой условие в вложенном цикле было истинным. Я подозреваю, что "ломать" ломает меня из обеих петель. Я хотел бы знать (1), как вырваться из одного из циклов for, и (2) если это единственная проблема, которую я получил здесь.

4b9b3361

Ответ 1

break и continue применяются к самому внутреннему циклу.

Проблема заключается в том, что вы открываете второй файл только один раз и поэтому читаете только один раз. Когда вы выполняете for y in file2.readlines(): во второй раз, file2.readlines() возвращает пустой итерабельный.

Переместите file2 = open(filename2, 'r') во внешний цикл или используйте seek() для перемотки назад в начало file2.

Ответ 2

Вам нужно разобрать числовые строки на соответствующие им значения.

Вы можете использовать int('hoge') следующим образом.

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