1

同じ要素で始まるかどうかに基づいて、ファイル内の 2 つの行を結合したいと思います。
各行の最初の要素をリストに変換し、このリスト内の要素を使用して各行を検索できますが、それは最も効率的な方法とは思えません。

次のファイルがあります

1,AF534061.1,T,A  
1,K02718.1,T,A  
16,AF534061.1,G,-  
16,K02718.1,G,-  
17,AF534061.1,T,-  
17,K02718.1,T,-  
18,AF534061.1,A,-  
18,K02718.1,A,-  
19,AF534061.1,T,-  
19,K02718.1,T,-  
20,AF534061.1,A,-  
20,K02718.1,A,-  
21,AF534061.1,A,-   
21,K02718.1,A,-  
24,AF534061.1,C,T   

最初のアイテムがライン間で共有されている場合、ラインを結合したいと考えています。だから私は次の出力を得たいと思います

1,AF534061.1,T,A,1,K02718.1,T,A
16,AF534061.1,G,-,16,K02718.1,G,-
17,AF534061.1,T,-,17,K02718.1,T,-
18,AF534061.1,A,-,18,K02718.1,A,-
19,AF534061.1,T,-,19,K02718.1,T,-
20,AF534061.1,A,-,20,K02718.1,A,-
21,AF534061.1,A,-,21,K02718.1,A,-
24,AF534061.1,C,T

この例では、1 行おきに結合できるように見えますが、コードをより一般的なものにしたい (必要がある) のです。

これは難しいとは思いませんが、理解できないようです。助けてくれてありがとう

4

3 に答える 3

6

Python標準ライブラリにはツールがたくさんあります。このジョブには、itertools.groupbyを使用します。

import itertools

lines = '''1,AF534061.1,T,A
1,K02718.1,T,A
16,AF534061.1,G,-
16,K02718.1,G,-
17,AF534061.1,T,-
17,K02718.1,T,-
18,AF534061.1,A,-
18,K02718.1,A,-
19,AF534061.1,T,-
19,K02718.1,T,-
20,AF534061.1,A,-
20,K02718.1,A,-
21,AF534061.1,A,-
21,K02718.1,A,-
24,AF534061.1,C,T'''.split('\n')

for key, group in itertools.groupby(lines, lambda line: line.partition(',')[0]):
    print ','.join(group)
于 2012-07-14T02:14:43.623 に答える
1

正規表現と後方参照を使用できます。

print re.sub(r'(([^,]+).*)\n(\2.*\n)', r'\1\3', data)

説明されている式は次のとおりです。

(             # Start of first line
 (            # Start of first part of line, refered to as \2
  [^,]+       # Everything before the first comma
 )
 .*           # Remainder of first line
)             # This new line isn't in any capture groups, so it'll be 
\n            #  removed from any matched results
(             # Start of second line
  \2          # This takes the first part of the first line and requires 
              #  it to match again
  .*          # Remainder of second line
  \n          # We include this newline to make the next search start at 
              #  the start of the following line.  It's reinserted because
              #  it's in the second line's capture group.
)
于 2012-07-14T02:09:43.020 に答える
-2

私はこのコードをテストしていませんが、次のようなものが機能するはずです:

 common = {}
 for line in file.readLines():
   prefix = line.split(",")[0]
   if prefix in common:
     common[prefix].append(line)
   else:
     common[prefix] = [line]

 for key, values in common:
   print values.join(",")
于 2012-07-14T02:13:21.470 に答える