-1

一致するインデックス[0]がある場合、行を調べてインデックスxを合計する必要があるコードがあります。これを作成するための最良の解決策は何でしょうか? 私はdefaultdictを持つことができたと思います.index [0]に一致するものがある場合は値を追加します. 行ごとに読み取り、インデックス [0] を常に一時メモリに保持し、次のインデックス [0] と一致する場合は合計する方法はありますか?

これは私がこれまでに持っているものです:

with open("test.txt") as f:
    dic = defaultdict(list)
    for line in f:
        spl =line.split("\t")
        if("Fam" in line):
            dic[spl[0]].append(spl[1:])
            a = float(spl[5])
            b = float(spl[6])
            sum = a * b
            output = str(sum)
            this = line.strip() + "\t"+output
            if("TK" in line): #I would like to start sum up after this. Read all lines that include "TK", check index[0] for matches, if match sum up. 

編集。私はソートされたリストに対してこれを行っています。

前もって感謝します

編集2。人々は私を理解するのに問題を抱えているので、何らかの出力が役立つかもしれません. 現在のバリアブルthisプリント:

Fam_c1_1        F       Extractions     02-0419 02-419TK        500     400     200000.0
Fam_c1_1        F       Extractions     5107    5107TK  1475    447.5   660062.5
Fam_c10_1       F       Extractions     5132    5132TK  1555    547.6   851518.0
Fam_c100_1      M       Extractions     5843    5843TK  2605    398.6   1038353.0
Fam_c1000_1     F       Extractions     9913    9913TK  1900    398     756200.0
Fam_c1001_1     F       Extractions     9512    9512TK  1050    20      21000.0

したがって、この場合、コードでリストを調べて、リストの最初の値を常にメモリに保持したいと思います。次の行の最初の値に一致する場合、x を実行します。

4

1 に答える 1

0

次のように sth を使用することを提案します。

with open('filename') as f:

   def lineValue(line):
     parts = line.split('\t')
     return float(parts[5]) * float(parts[6])

   def lineKey(line):
     parts = line.split('\t')
     return parts[0]

   for match, lines in groupby(
       line for line in f if "Fam" in line and "TK" in line,
       lineKey):
     yield sum(lineValue(line) for line in lines)

このように、一致するすべての値がすでに互いに続いているという事実に依存します。そうでない場合は、itertools.groupby()役に立ちません。そしてもちろん、行を 2 回分割することは、最も洗練された解決策ではありません。

一致する行が互いに続かない場合は、回答の辞書を作成してから、defaultdict妥当な音を作成する必要があります。

result = defaultdict(float)
with open('filename') as f:

   def lineValue(line):
     parts = line.split('\t')
     return float(parts[5]) * float(parts[6])

   def lineKey(line):
     parts = line.split('\t')
     return parts[0]

   for line in f:
     if "Fam" in line and "TK" in line:
       result[lineKey(line)] += lineValue(line)

繰り返しますが、行を 1 回だけ分割する方が、より洗練されたソリューションになります。

于 2013-05-27T09:56:40.667 に答える