将字典字典转换为制表符分隔文件的最pythonic方法是什么?我有下面的脚本,以
的形式生成字典字典{'name1:[{'AA':2,'GG':3,'CF':10}], name2:[{'AA':4, 'GG':9,'CF':5,'GT':1}]}
我正在寻找一种从那里获得输出的方法,如下所示(tab delimated):
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 :(得分:3)
鉴于您的数据形状不像csv,但这并不是超级优雅的方法,但这并不需要所有那么多代码。
我注意到,如果您的数据如下所示,这会更好一些:
{'name1':{'AA':2,'GG':3,'CF':10}, 'name2':{'AA':4, 'GG':9,'CF':5,'GT':1}}
而不是:
{'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
输出:
titles AA CF GG GT
name1 2 10 3 0
name2 4 5 9 1