我有一个列表列表:
x = [[AATG, ATAT, GGCC],
[CCTA, TCGT, AAAA],
[TTAA, GGAT, TACA]]
列表中的字符仅是ATCG的组合,列表中的每个元素的长度均为四个字符。内部列表的长度相等。
我想估计仅具有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)
,但不适用于带有regrex的模式。可以是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]
答案 0 :(得分:1)
您可以使用不带正则表达式的成员资格检查来简化检查:只需检查元素是否完全由“ A”和“ T”组成。
x = [['AATG', 'ATAT', 'GGCC'],
['CCTA', 'TCGT', 'AAAA'],
['TTAA', 'GGAT', 'TACA']]
members = {'A', 'T'}
result = []
for row in x:
#creates a list of bools, True only if an element contains just items from members set
element_status = [all(char in members for char in element) for element in row]
result.append(sum(element_status)/len(element_status))
print(result)
[0.3333333333333333, 0.3333333333333333, 0.3333333333333333]
要对正则表达式执行相同操作,您的模式确实可以工作。如果使用findall,则只需使用返回元素的长度即可。
import re
x = [['AATG', 'ATAT', 'GGCC'],
['CCTA', 'TCGT', 'AAAA'],
['TTAA', 'GGAT', 'TACA']]
members = {'A', 'T'}
pattern = '[AT]{4}'
result = []
for row in x:
element_status = [len(re.findall(pattern, element)) for element in row]
result.append(sum(element_status)/len(element_status))
print(result)
答案 1 :(得分:1)
在您的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]