我有一个列表列表:
x = [[AATG, ATAT, GGCC],
[CCTA, TCGT, AAAA],
[TTAA, GGAT, TACA]]
lists里面的字符只是ATCG的组合,lists of lists中的每个元素都是四个字符的长度。内部列表具有相同的长度。
我想估计一个只有 A 和 T 的所有组合的元素的频率;例如每列中的 ATAT(第一行第二列)、AAAA(第二行第三列)和 TTAA(第三行第一列)。
为了调用 A 和 T 的所有组合,我使用了正则表达式:
pattern = re.findall('[AT]{4}', key)
用于列表的阅读列表
y = []
for i in range(len(x[0])):
per.append(len([j[i] for j in x if j[i]==pattern])/len(x))
print(y)
如果我使用像“ATAT”这样的特定字符串,此代码将起作用:
y = []
for i in range(len(x[0])):
per.append(len([j[i] for j in x if j[i]=='ATAT'])/len(x))
print(y)
但它不适用于带有正则表达式的模式。可以是 re.findall 可以调用的任何东西,例如:
'[CG]{4}' for all element has C or G
'^(?=[GC]*[AT][GC]*$).{4}$' for 75% of element has G or C
预期输出:
[0.34, 0.34, 0.34]
请您参考如下方法:
在您的 if 语句 if j[i]==pattern 中,您检查 j[i] 是否等于 findall 的结果返回所有非重叠匹配项。
您可以使用 if pattern.match(j[i]) re.match相反,因为您想检查匹配项是否与字符类中的内容匹配 4 次。
x = [['AATG', 'ATAT', 'GGCC'],
['CCTA', 'TCGT', 'AAAA'],
['TTAA', 'GGAT', 'TACA']]
pattern = re.compile('[AT]{4}')
y = []
for i in range(len(x[0])):
y.append(len([j[i] for j in x if pattern.match(j[i])])/len(x))
print(y)
结果:
[0.3333333333333333, 0.3333333333333333, 0.3333333333333333]
