Skip to main content
 首页 » 编程设计

python之子列表每个位置的正则表达式模式的频率

2024年09月03日26birdshome

我有一个列表列表:

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] 

Python demo