2

したがって、次のようなファイルがいくつかあります。

snpID  Gene
rs1  ABC1
rs2  ABC1
rs3  ABC25
rs4  PT4
rs5  MTND24

別のファイルには、他の snpID と遺伝子のペアがありますが、特定の snpID が重複している可能性がありますが、関連付けられている対応する「遺伝子」は異なる可能性があります。例:

snpID  Gene
rs100  URX1
rs95  KL4
rs1  ABC1
rs2  ABC1-MHT5
rs3  ABC25
rs4  PT4-FIL42

私がやりたいことは、ファイルのすべての内容を追加し、同じsnpIDと遺伝子のペアがある場合は重複を削除することです. snpID に対応する遺伝子が異なる場合は、同じ行に移動する必要があります。上記の例では、次のようになります。

snpID  Gene
rs1  ABC1
rs2  ABC1, ABC1-MHT5
rs3  ABC25
rs4  PT4, PT4-FIL42
rs5  MTND2
rs100  URX1
rs95  KL4

辞書を作成することでこれを達成できると思いました。

import glob
file_list = glob.glob('annotations.*')
dict_snps_genes = {}
for filename in file_list:
    with open(filename) as fileA:
        for line in fileA:
            col0 = line.split()[0]
            col1 = line.split()[1]
            dict_snps_genes[col0] = col1 

unique_dict_snps = {}
for key,value in dict_snps_genes:
    if key not in unique_dict_snps.keys():
        unique_dict_snps_genes[key] = value

先に進む前にこれをテストしましたが、次のようなエラーが表示されます。

ValueError: too many values to unpack

PS: 各ファイルには約 8000 の snpId-Gene ペアがあり、5 つ以上のファイルがあります。

乗り越えるアイデア!!

4

4 に答える 4

6

キーをループしていますが、それらをキー変数と値変数の両方に割り当てようとしています:

for key,value in dict_snps_genes:

それをループオーバーするように変更します.items():

for key,value in dict_snps_genes.items():

さらに良いことに、Python 2.x の場合は、`.iteritems() を使用します。

for key,value in dict_snps_genes.iteritems():

ファイルを読み取る方法では、特定のsnpIDの最後に読み取った遺伝子のみを保存することに注意してください。その ID の別のエントリが見つかった場合は、前のものを上書きします。

個人的にはcollections.defaultdict()、デフォルトで使用しsetます:

import glob
import collections

file_list = glob.glob('annotations.*')
snps_genes = collections.defaultdict(set)
for filename in file_list:
    with open(filename) as fileA:
        for line in fileA:
            snpid, gene = line.strip().split(None, 1)
            snps_genes[snpid].add(gene)

現在、値snps_genesは遺伝子のセットであり、それぞれが一意です。行を空白 ( ) で 2 つに分割して.split(None, 1)、遺伝子値に空白がある場合は次のように保存されることに注意してください。

>>> 'id gene with whitespace'.split(None, 1)
['id', 'gene with whitespace']

左側の代入式として「snpid,gene」を使用することにより、Python は分割の結果を取得し、各部分を個別の変数に割り当てます。コード行を節約するための便利なトリックです。

これを新しいファイルに出力するには、結果のsnps_genes構造を単純にループします。すべてをソートするものは次のとおりです。

for id in sorted(snps_genes):
    print id, ', '.join(sorted(snps_genes[id]))
于 2013-01-02T14:50:43.067 に答える
2

私なら以下のように書きます。

from glob import glob
import fileinput

infiles = glob('annotations.*')
lines = fileinput.input(infiles)
rows = (line.split() for line in lines)

from collections import defaultdict
dd = defaultdict(list)
for row in rows:
    dd[row[0]].append(row[1])

値が一意である場合は、次のようになります。

dd = defaultdict(set)
for row in rows:
    dd[row[0]].add(row[1])

そしてそこから……。

于 2013-01-02T14:56:35.923 に答える
1

なぜそうしないのですか?

import glob
files = glob.glob('annotations.*')
d = {}
for f in files:
    with open(f) as f:
        for line in f:
            col0, col1 = line.split()
            if col0 not in d:
                d[col0] = [col1]
            elif col1 not in d[col0]:
                d[col0].append(col1)

結果は次のようになります。

d = {
    "rs95": ['KL4'],
    "snpID": ['Gene'],
    "rs1": ['ABC1'],
    "rs2": ['ABC1', 'ABC1-MHT5'],
    "rs3": ['ABC25'],
    "rs4": ['PT4', 'PT4-FIL42'],
    "rs5": ['MTND24'],
    "rs100": ['URX1']
}
于 2013-01-02T15:23:53.157 に答える
1

後の行を次のように置き換えることができますcol1 = line.split()[1]

if col0 in dict_snps_genes:
    dict_snps_genes[col0].add(col1)
else:
    dict_snps_genes[col0] = set([col1])

セットの詳細については、こちらをご覧ください。

于 2013-01-02T14:56:21.957 に答える