【发布时间】:2017-02-25 20:07:17
【问题描述】:
碱基是指A、T、G和C
sample = [['CGG','ATT'],['GCGC','TAAA']]
# Note on fragility of data: Each element can only be made up only 2 of the 4 bases.
# [['CGG' ==> Only C and G,'ATT' ==> Only A and T],['GCGC'==> Only C and G,'TAAA' ==> Only T and A]]
# Elements like "ATGG" are not present in the data as the have more than 3 different types of bases
考虑第一对:['CGG','ATT']
-
分别计算对中每个碱基的频率:
CGG => (C = 1/3, G = 2/3) ATT => (A = 1/3, T = 2/3)
-
计算对中碱基组合的出现频率。在这里,组合是'CA'和'GT'(注意,基本的顺序很重要。不是'CA','AC','GT'和'TG'。只有'CA'和'GT') .
对 => (CA = 1/3, GT = 2/3)
-
计算float(a) = (对的频率) - ((CGG中C的频率) * (ATT中A的频率))
例如在 CA 对中,float (a) = (CA 对的频率) - ((CGG 中 C 的频率) * (ATT 中 A 的频率))
输出 a = (1/3) - ((1/3) * (1/3)) = 0.222222
计算任何一个组合的“a”(CA 对或 GT 对)
注意:如果对是 AAAC 和 CCCA,则 C 的频率将是 1/4,即它是碱基在其中一对上的频率
-
计算 b float (b) = (float(a)^2)/ (CGG 中 C 的频率) * (CGG 中 G 的频率) * (ATT 中的频率 A) * (ATT 中 T 的频率)
Output b = 1
对整个列表执行此操作
Final Output a = [0.2222, - 0.125]
b = [1, 0.3333]
此代码改编自this answer。请注意,这两个问题存在细微差别,在解决问题的方法上也不相同。
但是,我无法运行此代码。我收到以下错误: 对于配对,计入 i: TypeError: 'int' 对象不可迭代
#Count individual bases.
sample4 = [['CGG','ATT'],['GCGC','TAAA']]
base_counter = Counter()
for i in enumerate(sample4):
for pair, count in i:
base_counter[pair[0]] += count
base_counter[pair[1]] += count
print base_counter
# Get the total for each base.
total_count = sum(base_counter.values())
# Convert counts to frequencies.
base_freq = {}
for base, count in base_counter.items():
base_freq[base] = count / total_count
# Not sure how to write a code to count the number of pairs (Step 2)
# Let's say the counts have been stored in pair_counts
# Examine a pair from the two unique pairs to calculate float_a.
for i in enumerate(sample4):
float(a) = (pair_count[pair] / sum(pair_count.values())) - (base_freq[pair[0]] * base_freq[pair[1]])
# Step 7!
for i in enumerate(sample4):
float_b = float_a / float(base_freq[0][0] * base_freq[0][1] * base_freq[1][0] * base_freq[1][1])
【问题讨论】:
-
for j in i[0]:??删除此行。 -
你使用
Counter的方式不如使用普通的dict。 -
range函数返回一个整数列表,因此在您的第一个循环中,每个i都是一个int。您的错误是因为在嵌套的for循环中,您试图迭代int。也许您想改用enumerate,或者简单地迭代sample4 -
@Jean-FrançoisFabre:好的,我会
-
@Biotechgeek,是的......您的代码中还有很多其他错误。我认为您应该花时间研究循环在 python 中的工作方式,以及
range和enumerate的工作方式。此外,如果您尝试在 REPL 中逐行运行而不是尝试一次运行整个脚本,那么这类事情也会有所帮助。它可以让你看到每一步的输出是什么。
标签: python list dictionary count