2017-07-19 11 views
2

もう一度ヘルプが必要です。最初の辞書のキーと第2の辞書の値を比較する

多くの情報を含む大きなデータベースファイル(db.csvと呼ぶ)があります。

説明するために簡素化されたデータベースファイル:

Simplified database file to illustrate

私はそれらをクラスタ化するために、私の遺伝子配列にusearch61 -cluster_fastを実行します。
「clusters.uc」という名前のファイルが取得されました。私はcsvとしてそれを開いた。そして、私はクラスタ番号をキーとして、gene_id(VFG ...)を値として辞書を作成するコードを作った(dict_1と言う)。 dict_1

0 ['VFG003386', 'VFG034084', 'VFG003381'] 
1 ['VFG000838', 'VFG000630', 'VFG035932', 'VFG000636'] 
2 ['VFG018349', 'VFG018485', 'VFG043567'] 
... 
14471 ['VFG015743', 'VFG002143']  

これまでのところは良い:ここで
は、私は、ファイルに保存されている作られたものの一例です。次にdb.csvを使って私はgene_id(VFG ...)がキーで、VF_Accession(IA ...またはCVF ..またはVF ...)が値、イラストである別の辞書(dict_2)を作った:dict_2

私は最後にしたいことは、各VF_Accessionのクラスタグループ、イラストの番号を持つことです。

IA027 [0,5,6,8] 
CVF399 [15, 1025, 1562, 1712] 
... 

だから私は、私はまだ私は比較のコードを作成する必要があり、コードで初心者ですので、推測dict_1(VFG ...)からdict_2(VFG ...)のキーまでの値。一致する場合は、VF_Accessionをキーとしてすべてのクラスタ番号を値として入れます。 VF_Accessionはキーなので重複することはできません。リストの辞書が必要です。私はdict_1のために作ったので、私はそれを行うことができると思います。しかし、私の問題は、dict_1の値をdict_2のキーと比較し、各VF_Accessionにクラスター番号を入れる方法を見つけることができないということです。私を助けてください。

+0

バイオについて多く知っている - 同じgene_id(VFG)が複数のクラスターに現れることはありますか? –

+0

はい、残念ながらそれらのいくつかはあります。 IA027 [0 | 12、5、6、8]またはIA027 [0(12)、5、6、8] –

答えて

3

まず、あなたの辞書にいくつかのより良い名前をつけましょう。dict_1dict_2、...それらを使って作業したり、その内容を覚えやすくしましょう。

あなたが最初の値としてキーとgene_idsとしてクラスタ番号を持っている辞書(VFG ...)作成:

cluster_nr_to_gene_ids = {0: ['VFG003386', 'VFG034084', 'VFG003381', 'VFG044259'], 
          1: ['VFG000838', 'VFG000630', 'VFG035932', 'VFG000636'], 
          2: ['VFG018349', 'VFG018485', 'VFG043567', 'VFG012016'], 
          5: ['VFG011941'], 
          7949: ['VFG003386'],        
          14471: ['VFG015743', 'VFG002143', 'VFG012016']} 

をそしてgene_idsがキーとVF_Accessions(IAあるどこにも別の辞書を持っています...またはCVF ..またはVF ...)値は次のとおりです。

gene_id_to_vf_accession = {'VFG044259': 'IA027', 
          'VFG044258': 'IA027', 
          'VFG011941': 'CVF397', 
          'VFG012016': 'CVF399', 
          'VFG000676': 'VF0142', 
          'VFG002231': 'VF0369', 
          'VFG003386': 'CVF051'} 

そして私たちは、各VF_Accessionキーが値としてクラスタグループの番号を持っている辞書作成したい:vf_accession_to_cluster_groupsを。

我々はまた、VFアクは、例えば(複数の遺伝子IDに属していることに注意してください:VFアクIA027VFG044259VFG044258遺伝子IDの両方を持っている

だから我々としてVFアクで辞書を作るためにdefaultdictを使用しますキーと値のような遺伝子IDのリスト私は上記の投稿のサンプルデータについては

from collections import defaultdict 
vf_accession_to_gene_ids = defaultdict(list) 
for gene_id, vf_accession in gene_id_to_vf_accession.items(): 
    vf_accession_to_gene_ids[vf_accession].append(gene_id) 

vf_accession_to_gene_idsは今のようになります。

defaultdict(<class 'list'>, {'VF0142': ['VFG000676'], 
          'CVF051': ['VFG003386'], 
          'IA027': ['VFG044258', 'VFG044259'], 
          'CVF399': ['VFG012016'], 
          'CVF397': ['VFG011941'], 
          'VF0369': ['VFG002231']}) 

これで、各VF登録をループし、遺伝子IDのリストを調べることができます。そして、すべてのクラスタの上に、各遺伝子のIDについて、我々ループおよび遺伝子IDが存在するかどうかを確認:

vf_accession_to_cluster_groups = {} 
for vf_accession in vf_accession_to_gene_ids: 
    gene_ids = vf_accession_to_gene_ids[vf_accession] 
    cluster_group = [] 
    for gene_id in gene_ids: 
     for cluster_nr in cluster_nr_to_gene_ids: 
      if gene_id in cluster_nr_to_gene_ids[cluster_nr]: 
       cluster_group.append(cluster_nr) 
    vf_accession_to_cluster_groups[vf_accession] = cluster_group 

今上記のサンプルデータのための最終的な結果は次のとおりです。私はしません

{'VF0142': [], 
'CVF051': [0, 7949], 
'IA027': [0], 
'CVF399': [2, 14471], 
'CVF397': [5], 
'VF0369': []} 
+0

本当にあなたの助けに本当に感謝していますが、もし私がもっと私を助けてくれれば残っている問題はほとんどありません:cluster_nr_to_gene_idsでは同じgene_idは多くのクラスタ番号を持つことができます。イラスト:0 ['VFG003386'] 7949 ['VFG003386']したがって、vf_accessionには2つのクラスタグループが必要です。 CVF051 ['0、7949'] CVF051 [0] –

+0

@rookiemax、私のコードは、遺伝子IDが複数のクラスターにあるときに機能します。私が提供したサンプルで更新したサンプルデータを見てください。あなたが何か間違っているか、より完全なデータセットを提供して、どこがうまくいかないかを見なければならないかどうかを見てください。 – BioGeek

+1

あなたは正しいことをしています。私のコード行を削除した後、それは完全に機能しました:D私は本当に素晴らしいです、あなたの助けを借りてありがとう:D本当にタンク:D –

1

警告:私は多くのPython開発をしていないので、これを行うより良い方法があります。あなたは、まずあなたのVFGは...そのクラスタ番号にgene_idsをマッピングし、2番目の辞書を処理するためにそれを使用することができます

from collections import defaultdict 
import sys 
import ast 

# see https://stackoverflow.com/questions/960733/python-creating-a-dictionary-of-lists 
vfg_cluster_map = defaultdict(list) 

# map all of the vfg... keys to their cluster numbers first 
with open(sys.argv[1], 'r') as dict_1: 
    for line in dict_1: 
     # split the line at the first space to separate the cluster number and gene ID list 
     # e.g. after splitting the line "0 ['VFG003386', 'VFG034084', 'VFG003381']", 
     # cluster_group_num holds "0", and vfg_list holds "['VFG003386', 'VFG034084', 'VFG003381']" 
     cluster_group_num, vfg_list = line.strip().split(' ', 1) 
     cluster_group_num = int(cluster_group_num) 

     # convert "['VFG...', 'VFG...']" from a string to an actual list 
     vfg_list = ast.literal_eval(vfg_list) 
     for vfg in vfg_list: 
      vfg_cluster_map[vfg].append(cluster_group_num) 

# you now have a dictionary mapping gene IDs to the clusters they 
# appear in, e.g 
# {'VFG003386': [0], 
# 'VFG034084': [0], 
# ...} 
# you can look in that dictionary to find the cluster numbers corresponding 
# to your vfg... keys in dict_2 and add them to the list for that vf_accession 
vf_accession_cluster_map = defaultdict(list) 
with open(sys.argv[2], 'r') as dict_2: 
    for line in dict_2: 
     vfg, vf_accession = line.strip().split(' ') 

     # add the list of cluster numbers corresponding to this vfg... to 
     # the list of cluster numbers corresponding to this vf_accession 
     vf_accession_cluster_map[vf_accession].extend(vfg_cluster_map[vfg]) 

for vf_accession, cluster_list in vf_accession_cluster_map.items(): 
    print vf_accession + ' ' + str(cluster_list) 

そして、上記のスクリプトを保存して、python <script name> dict1_file dict2_file > outputのようにそれを呼び出す(あるいはあなたが文字列を書くことができますファイルを印刷してリダイレクトするのではなく)。

EDIT:@ BioGeekの答えを見てから、dict_1とdict_2ファイルを作成して読み込み、数字やリストに戻して解析して、辞書にファイルを書き込む必要がない場合は、スクリプトに他のコードを追加して辞書を直接使用することができます。

+1

私はあなたに助けていただきありがとうございます:D –

+0

私の問題。さらに、私はPythonコーディングのために新しいことを学びました。再び感謝します。D –

+0

それを聞いてうれしかったのはうれしかったです! –

関連する問題