Python中的嵌套循环将结果存储在单个字典中

时间:2019-12-20 07:36:04

标签: python loops nested-loops bioinformatics

晚上好,

我目前正在研究一个程序,以在继续攻读本科学位时进一步了解Python。我正在尝试创建一个利用Markov模型来提供和预测某些P(x)语句的生物信息学程序。我正在清理代码,因为我发现了很多重复。我不是要寻求答案-莫索(Moreso)的建议或者是推动我保持积极,以Python为中心的思维定势的方向。

Python中有什么可以改变的方式

aa_count = markov_data_set.count('AA')
at_count = markov_data_set.count('AT')
ag_count = markov_data_set.count('AG')
ac_count = markov_data_set.count('AC')
tt_count = markov_data_set.count('TT')
ta_count = markov_data_set.count('TA')
tg_count = markov_data_set.count('TG')
tc_count = markov_data_set.count('TC')
cc_count = markov_data_set.count('CC')
ca_count = markov_data_set.count('CA')
cg_count = markov_data_set.count('CG')
ct_count = markov_data_set.count('CT')
gg_count = markov_data_set.count('GG')
ga_count = markov_data_set.count('GA')
gt_count = markov_data_set.count('GT')
gc_count = markov_data_set.count('GC')

变得更简单吗?我读过几本关于Python的书(《 Python速成班》和《用Python进行科学编码入门》),我相信我可以使用循环或嵌套循环来使内容更短,更有组织。我尝试过的示例如下:

di_nucleotide = ('AA', 'AT', 'AG', 'AC', 'TT', 'TA', 'TG', 'TC', 'CC', 'CA', 'CG', 'CT', 'GG', 'GA', 'GT', 'GC')
nucleotide_count = ()
nucleotide_frequency = []

for binomials in di_nucleotide:
     di_nucleotide.count()


问题是,可悲的是...我被困在那里,这有点令人气our。我希望最终产品是将Var1和Var2存储到单个字典文件中的东西,以后我可以存储或调用它,同时也可以根据需要将这两个变量分开。

di_nucleotide = ('AA', 'AT', 'AG', 'AC', 'TT', 'TA', 'TG', 'TC', 'CC', 'CA', 'CG', 'CT', 'GG', 'GA', 'GT', 'GC')
nucleotide_count = (int1, int2, int3, int4, ...)
nucleotide_frequency = ['AA':Count, 'AT'Count, 'AG'Count, ...]

这是我关于SO的第一篇文章。我知道这可能不是寻求建议的最佳途径,但是如果将来有什么我可以做的事情来改善我的职位,请告诉我,以便我有所改善。

一如既往,谢谢大家,祝您有美好的一天!我期待继续我的编码之旅。

2 个答案:

答案 0 :(得分:2)

使用itertools.product生成配对:

import itertools

bases = 'ACGT'
nucs = [''.join(pair) for pair in itertools.product(bases, repeat=2)]
# ['AA', 'AC', 'AG' ....

然后,您可以在字典理解内的循环中运行该函数,从而替换您的单个调用:

counts = {nuc: markov_data_set.count(nuc) for nuc in nucs}

counts是您的结果的字典。键是'AA''AC'等。

答案 1 :(得分:0)

您可以将所有内容存储在字典中,该字典是您即时生成的:

# initialise dictionary and total counts
nucleotide_counts = {}
total_counts = 0

# loop through dinucleotide counts
for dn in ['AA', 'AT', 'AG', 'AC', 'TT', 'TA', 'TG', 'TC', 'CC', 'CA', 'CG', 'CT', 'GG', 'GA', 'GT', 'GC']:
    # store in dictionary
    counts = markov_data_set.count(dn)
    nucleotide_counts[dn] = counts
    total_counts += counts

从那里,您可以生成频率:

frequencies = {}
for dn, counts in nucleotide_counts.items():
    frequencies[dn] = counts / total_counts