Частота регулярных выражений в каждой позиции подсписка - PullRequest
2 голосов
/ 10 мая 2019

У меня есть список списков:

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]

Ответы [ 2 ]

1 голос
/ 10 мая 2019

В вашем операторе 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

1 голос
/ 10 мая 2019

Вы можете использовать проверку членства без регулярных выражений, чтобы упростить эту проверку: просто проверьте, состоит ли элемент полностью из '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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...