web-dev-qa-db-ja.com

1つのネストされたループのみから抜け出す方法

2つのタブ区切りファイルがあり、最初のファイルのすべての行を他のファイルのすべての行に対してテストする必要があります。例えば、

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

col [1]が同じである場合、file1のcol [3]がfile2のcol [2]よりも小さい(file1)のすべての行を出力するとします。

期待される出力:

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ループの1つだけから抜け出す方法、および(2)これが私がここで持っている唯一の問題であるかどうかを知りたいです。

14
biohazard

breakおよびcontinueは、最も内側のループに適用されます。

問題は、2番目のファイルを1回だけ開くため、1回しか読み取れないことです。 for y in file2.readlines():を2回目に実行すると、file2.readlines()は空のイテラブルを返します。

file2 = open(filename2, 'r')を外側のループに移動するか、seek()を使用してfile2の先頭に巻き戻します。

23
NPE

数値文字列を対応する整数値に解析する必要があります。

次のように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
2
eisoku9618