2016-05-18 11 views
0

辞書の辞書をタブ区切りファイルに変換するにはどうしたらいいですか?私は、私は、次の(タブdelimated)のように見え、そこからの出力を取得する方法を探していますその下のスクリプトは辞書の辞書をタブファイルに変換する最良の方法

{'name1:[{'AA':2,'GG':3,'CF':10}], name2:[{'AA':4, 'GG':9,'CF':5,'GT':1}]} 

の形で辞書の辞書を生成します:

titles AA GG CF GT 
name1 2 3 10 0 
name2 4 9 5 1 

私はそれを行う便利な方法を理解することができませんでした。これは、ファイルから頻度を取得するために使用したスクリプトです。

def kmer_counts(b,link): 
kmer_dict = {} 
values = [] 
for filename in os.listdir(b): 
    if str(filename).endswith(link): 
    for record in SeqIO.parse(os.path.join(b, filename), "fasta"): 
     id_=record.id 
     seq = record.seq 
     mylist = kmer_list(seq,4) 
     c = collections.Counter(mylist) 
     c = dict(c) 
     val = list(c.values()) 
     keys = [] 
     for key in c: 
      keys.append(str(key)) 
     c_edit = dict(zip(keys,val)) 
     kmer_dict.setdefault(str(id_),[]) 
     kmer_dict[str(id_)].append(c_edit) 
print kmer_dict 

注:正しいものが出力されていないと指摘したため、スクリプトを修正しました。

+0

'( 'AA':2)'は '( 'AA'、2)'でしょうか? –

+0

はい!申し訳ありませんが、私はそれに応じて変更します。 – Ella

答えて

3

あなたのデータがcsvのような形ではないということを考えれば、極端に洗練されたアプローチはありませんが、それほど多くのコードは必要ありません。

私はあなたのデータは、このように見えたならば、これは非常にわずかに良くなることに注意してください:

とにかく
{'name1':[{'AA':2,'GG':3,'CF':10}], 'name2':[{'AA':4, 'GG':9,'CF':5,'GT':1}]} 
     ^     ^  ^       ^

import csv 
import sys 

# your data 
data = {'name1':[{'AA':2,'GG':3,'CF':10}], 'name2':[{'AA':4, 'GG':9,'CF':5,'GT':1}]} 
topleft = 'titles' # whatever you want the leftmost column header to be 

# identify the column headers, and put them in alphabetical order (or some other order, if you'd prefer that) 
headers = sorted(set(key 
        for row in data.values() 
        for key in row[0])) 

# open a csv writer - this one writes to sys.stdout for interactive convenience 
writer = csv.writer(sys.stdout, delimiter='\t') 

# write the headers 
writer.writerow([topleft] + headers) 

for key in data: 
    # construct each row 
    row = [key] # row header 
    for header in headers: 
     row.append(data[key][0].get(header, 0)) # use 0 if a given header is absent in a given row 
    writer.writerow(row) # write the row 

出力:

これに代えて

{'name1':{'AA':2,'GG':3,'CF':10}, 'name2':{'AA':4, 'GG':9,'CF':5,'GT':1}} 

titles AA CF GG GT 
name1 2 10 3 0 
name2 4 5 9 1 
+0

ありがとう、以前のコードを変更することで、これを動作させて単純化することができました。私は助けに感謝します。 – Ella

関連する問題