質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

951閲覧

2行をセットにして比較

退会済みユーザー

退会済みユーザー

総合スコア0

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2018/11/13 01:35

編集2018/11/13 01:37
(file1) 12 CA 1.00 49.66 -0.0125 12 C 1.00 57.90 0.1763 13 CA 1.00 57.10 0.4509 13 C 1.00 61.98 0.4591 14 CA 1.00 62.19 0.1501 14 C 1.00 63.58 0.1205
(file2) 1 CA 1.00 67.95 0.3678 1 C 1.00 67.95 0.1392 2 CA 1.00 236.11 0.2495 2 C 1.00 236.11 0.7734 3 CA 1.00 237.00 0.6279 3 C 1.00 237.00 0.1079

file1とfile2の5列目の大小を比較し、大きい方を出力するということをしたいです。
ただし、ある行で2列目がCAのときにfile1の方が大きくても、その行と1列目が同じ次の行でfile2の方が大きいならば、ある行でもfile2を出力するようにしたいです。

つまり、1列目が同じである2行をセットで比較したいです。

(file1) 12 CA 1.00 49.66 -0.0125 ←この 12 C 1.00 57.90 0.1763 ←2行と 13 CA 1.00 57.10 0.4509 13 C 1.00 61.98 0.4591 14 CA 1.00 62.19 0.1501 14 C 1.00 63.58 0.1205
(file2) 1 CA 1.00 67.95 0.3678 ←この 1 C 1.00 67.95 0.1392 ←2行をセットとして比較 2 CA 1.00 236.11 0.2495 2 C 1.00 236.11 0.7734 3 CA 1.00 237.00 0.1279 3 C 1.00 237.00 0.1079
(得たい結果) 1 CA 1.00 67.95 0.3678 # file1 < file2 1 C 1.00 67.95 0.1392 # file1 > file2だが、前の行の結果からfile2を出力 2 CA 1.00 236.11 0.2495 # file1 > file2だが、次の行の結果からfile2を出力 2 C 1.00 236.11 0.7734 # file1 < file2 14 CA 1.00 62.19 0.1501 # file1 > file2 → file1を出力 14 C 1.00 63.58 0.1205 # file1 > file2 → file1を出力

そこで、以下のようなスクリプトを書きました。

python

1path = 'file1' 2path2 = 'file2' 3 4f = open(path) 5f2 = open(path2) 6list = f.readlines() 7list2 = f2.readlines() 8f.close() 9f2.close() 10 11for (line,line2) in zip(list,list2): 12 line1_1 = line[23:30] 13 line2_1 = line2[23:30] 14 line1_2 = float(line1_1) 15 line2_2 = float(line2_1) 16 line1_3 = line[6:8] 17 line2_3 = line2[6:8] 18 if line1_3 == "CA" and line2_3 == "CA" and (line1_2 < line2_2): 19 fileobj = open("sequence_line.log","a") 20 fileobj.write(line2) 21 elif line1_3 == "CA" and line2_3 == "CA" and (line1_2 >= line2_2): 22 if line1_3 == "C " and line2_3 == "C " and line1_2 < line2_2: 23 fileobj = open("sequence_line.log","a") 24 fileobj.write(line2) 25 else: 26 fileobj = open("sequence_line.log","a") 27 fileobj.write(line1) 28# ここまでで、CAの行がfile1 < file2 → file2を出力 29#       CAの行がfile1 > file2 かつ その次のCの行がfile1 < file2 → file2の行を出力 はOK 30 elif line1_3 == "C " and line2_3 == "C " and (line1_2 < line2_2): 31 fileobj = open("sequence_line.log","a") 32 fileobj.write(line2) 33 elif line1_3 == "C " and line2_3 == "C " and (line1_2 >= line2_2): 34 if line1_3 == "CA" and line2_3 == "CA" and (line1_2 < line2_2): 35 fileobj = open("sequence_line.log","a") 36 fileobj.write(line2) 37 else: 38 fileobj = open("sequence_line.log","a") 39 fileobj.write(line1) 40# Cの行がfile1 < file2 → file2を出力 はOK 41## Cの行がfile1 > file2 かつ その前のCAの行がfile1 < file2 → file2の行を出力ができない。。。 42 43

説明するのが難しく、理解しづらいかもしれませんが、要は2行セットで比較したいです。
何かうまいやり方をご存知でしたらお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2018/11/13 01:58

要するに、①2行を一括して比較する。②第1行目と第二行目どちらもfile1 > file2ならfile1、③そうでなければfile2を出力、というルールでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/13 01:59

その通りです。書き方が悪くてすみません。
guest

回答1

0

ベストアンサー

実現したいことは
0. 2行を一括して比較する
0. 第1行目と第二行目どちらもfile1 > file2ならfile1
0. そうでなければfile2を出力

と表現できます。愚直ですが以下のようなループで実現できます。

Python

1lst1 = [1,2,3,4,5,6] 2lst2 = [2,1,2,5,4,5] 3assert((len(lst1) == len(lst2)) and (len(lst1) % 2 == 0)) 4 5# 以下、行番号は0始まりで考える。先頭行=0行目 6prev = '' # 奇数行目の出力用 7for i in range(len(lst1)): 8 ret = prev 9 if i % 2 == 0: # 偶数行目で比較 10 ret = 'lst2' 11 if lst1[i] > lst2[i] and lst1[i+1] > lst2[i+1]: 12 ret = 'lst1' 13 prev = ret # 奇数行目用に記憶 14 print(i,ret) 15""" 160 lst2 171 lst2 182 lst2 193 lst2 204 lst1 215 lst1 22"""

投稿2018/11/13 02:21

編集2018/11/13 02:23
can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/13 02:30

回答ありがとうございます。 lst1 = [1,2,3,4,5,6] lst2 = [2,1,2,5,4,5] とはどういう意味でしょうか。
can110

2018/11/13 02:34

単に例示のためのサンプルデータです。lst1はfile1の代わりです。 「-0.0125,…」のような実数値だと確認しずらいので単純な値にしています。
退会済みユーザー

退会済みユーザー

2018/11/13 03:30

for文で何をしているのか説明していただけませんか?
can110

2018/11/13 03:32

具体的にどの部分の何が分からないでしょうか?
退会済みユーザー

退会済みユーザー

2018/11/13 03:40 編集

提示していていただいたコードでは5列目のみ処理、出力していますが、実際には行全体を出力したいです。 そこで、for文の前にfor文とスライスを使って5列目を変数とし、処理を行っています。 for (line,line2) in zip(list,list2): line1_1 = line[23:30] line2_1 = line2[23:30] を入れています。 そうすると、うまくいきません。 そこで、提示していていただいたコード内容の理解を深めたいので、説明をお願いできませんか?
can110

2018/11/13 03:42

まずは私の単純な回答コードの動きは理解されましたか? なお、提示コードはあまりに複雑?なので、私はコードおよび動作は見ていません。
退会済みユーザー

退会済みユーザー

2018/11/13 03:47

初めに確認致しました。 実際のファイルはかなり行や列の数が多いので、それに対応できるよう編集しようと考えています。 prev = '' # 奇数行目の出力用 for i in range(len(lst1)): ret = prev の部分が分からないので、どういう操作なのか教えてください。
can110

2018/11/13 03:55 編集

forループは1データ行毎に処理していますが 1つ前の偶数行で求めた結果を、奇数行(どちらが大きいか求める必要がない行)でも出力できるようにprevに記憶させています。 このprev変数は、行や列の数には関係なく「file1、file2のどちらが大きかったか」という2状態だけを持てればよいので、たとえばbool型の変数でも代用できます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問