【发布时间】:2016-10-17 01:10:11
【问题描述】:
sample = [['CGG','ATT'],['GCGC','TAAA']]
#Frequencies of each base in the pair
d1 = [[{'G': 0.66, 'C': 0.33}, {'A': 0.33, 'T': 0.66}], [{'G': 0.5, 'C': 0.5}, {'A': 0.75, 'T': 0.25}]]
#Frequencies of each pair occurring together
d2 = [{('C', 'A'): 0.33, ('G', 'T'): 0.66}, {('G', 'T'): 0.25, ('C', 'A'): 0.5, ('G', 'A'): 0.25}]
问题:
考虑第一对:['CGG','ATT']
如何计算a,其中a是:
float(a) = (freq of pairs) - ((freq of C in CGG) * (freq of A in ATT))
eg. in CA pairs, float (a) = (freq of CA pairs) - ((freq of C in CGG) * (freq of A in ATT))
Output a = (0.33) - ((0.33) * (0.33)) = 0.222222
计算任何一个组合的“a”(CA 对或 GT 对)
Final Output for sample : a = [0.2222, - 0.125]
如何计算b,其中b是:
float (b) = (float(a)^2)/ (freq of C in CGG) * (freq G in CGG) * (freq A in ATT) * (freq of T in ATT)
Output b = 1
对整个列表执行此操作
Final Output for sample : b = [1, 0.3333]
我不知道如何从 d1 和 d2 中提取所需的值并执行数学运算。
我尝试为 a 的值编写以下代码
float a = {k: float(d1[k][0]) - d2[k][0] * d2[k][1]for k in d1.viewkeys() & d2.viewkeys()}
但是,它不起作用。另外,我更喜欢 for 循环而不是推导式
我尝试为上述内容编写(一个相当有缺陷的)for循环:
float_a = []
for pair,i in enumerate(d2):
for base,j in enumerate(d1):
float (a) = pair[i][0] - base[j][] * base[j+1][]
float_a.append(a)
float_b = []
for floata in enumerate(float_a):
for base,j in enumerate(d1):
float (b) = (float(a) * float(a)) - (base[j] * base[j+1]*base[j+2]*base[j+3])
float_b.append(b)
【问题讨论】:
-
第一次组合
a = d2[0][0][('C','A')] - d1[0][0]['C'] * d1[0][1]['A'] -
你试过那些简单的(嵌套的)for循环吗?甚至可能以最简单的方式,迭代索引而不是值。让它工作,然后你就可以开始重构了。
-
当我计算
sample列表中第二项的“a”值(即['GCGC','TAAA'])时,我得到两个不同的“a”值(CA = GT = 0.125 ,GA = -0.125)。选择样本的最终“a”输出为 -0.125 而不是 +0.125 时,是否有任何理由? -
@furas 我需要一个通用的循环,而不是一个特定的循环
-
@user2588654 我选择哪个“a”并不重要,因为值将是相同的(正如您计算的那样),并且在计算 b 时,我将“a”的值平方,所以问题的标志消失。对于我的程序,我终于需要 b 的值
标签: python list dictionary counter