1

パイソン初心者です。タブ区切りの情報が同じ形式のテキスト ファイルが 2 つあります。これらには、3 つの列 (識別子、染色体、および位置) を持つ行が含まれています。

ファイル 1:

2323 2 125
2324 3 754

...など

ファイル 2:

2323 2 150
2324 3 12000

...など

1 つのファイル内の各識別子 (各行の最初の列) を調べて、リストまたはマトリックスを作成したい (何が最適なのか、またはこれがどのように機能するのか正確にはわかりません。おそらくリストのリストがマトリックスになります?!)その位置 (column3) を使用して、次のファイルでこの一致する識別子を見つけ、このファイルの他の位置 (column3) も保存します。SO 最終的に、各識別子は 2 つの異なるファイルからの 2 つの異なる位置に関連付けられます。

これは私が助けを必要としているものです。次のステップでは、位置間の数値差が最大の識別子を探します。

ヘルプ、ヒント、または解決策は大歓迎です。私は非常に基本的な知識を持つPythonの初心者です。

よろしくお願いします!

ルバル

4

3 に答える 3

2

あなたの質問にはいくつかの答えがあります:

  1. 行列で大規模な計算を使用する予定がある場合は、非常に効率的なnumpyライブラリを確認することをお勧めします。ここで numpy を使用して行列を作成する方法を確認できます。
  2. あなたの質問に対する2番目の可能な答えは、biopythonライブラリを使用することです(あなたが染色体を扱っているという結論に達しました)。
  3. Python のネストされたリストを使用して行列を作成できます。

これを行う方法のコード スニペットを次に示します (ファイル 2 から読み取ると仮定します)。

matrix = []
with open(path_to_file2, 'rt') as f:
    for line in f:
        matrix.append(map(int, line.strip().split(' ')))

次に、作成された行列の値を取得できます。

matrix[0]     # First row == [2323, 2, 150]
matrix[0][1]  # Second column, first row == 2
于 2012-08-13T19:42:37.810 に答える
2
import collections
d=collections.defaultdict(list)
for f in ('file1','file2'):
    with open(f) as f1:
        for line in f1:
            ident, chrom, pos = line.split()
            d[ident].append(int( pos ))


#big differences at end of list
items = sorted(d.items(), key = lambda item: abs(item[1][1] - item[1][0])) 

#big differences at beginning of list
#items = sorted(d.items(), reverse = True, key = lambda item: abs(item[1][1] - item[1][0])) 

このソリューションでは、ファイルからの情報を辞書として保存します。キーは識別子で、値は位置を含むリストです。次に、位置のリストの最初の要素と 2 番目の要素の差の絶対値に基づいて、その辞書の項目を並べ替えます。つまり、最大の違いはitemsリストの最後にあります。

これが機能するためには、file1とが同じ識別子file2を持っていることを前提としています。そうでない場合は、最初にアイテムをフィルタリングして、長さが 2 の値を持つ辞書エントリのみを選択する必要があります。

items = [(k,v) for k,v in d.items() if len(v) == 2]
items = sorted(items, ...)
于 2012-08-13T19:46:36.537 に答える
1

識別子をキーとして、位置のリストを値として持つ辞書を使用できます。次に、位置の差を計算し、それをリストの 3 番目の要素にすることができます。次に、ディクショナリを反復処理して、ディクショナリの値の位置 [2] にある最大値を見つけることができます。

d = {}
for each line in file1:
   d[identifier] = [position]

for each line in file2:
   d[identifier].append(position)
   d[identifier].append(d[identifier][1]-d[identifier][0])

maxDiff = 0
for x in d:
    value = d[x][2]
    if value > maxDiff:
        maxDiff = value
于 2012-08-13T19:46:22.493 に答える