gpt4 book ai didi

python - 找出给定结构中的 RNA 碱基配对

转载 作者:太空宇宙 更新时间:2023-11-03 23:42:45 25 4
gpt4 key购买 nike

我有一个 RNA 序列,看起来像这样。每个字符代表一个核苷酸(程序员可以忽略这一点,你可以把它们当作元素):

         (((((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))))....

为了问题的目的,我将使用这个术语:

          ( = lhb
) = rhb
. = dot

所以本质上,具有 lhb 的元素连接到具有 rhb 的元素,并且所有的点都是自由区域。它们的连接方式很复杂。很难用语言表达,所以为了方便起见,我将在一些元素下方放置数字,这些元素是相连的:

   (((((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))))....
1 2 2 3 3 45 5 4 1

我认为这会让您了解它们之间的联系。我有兴趣找出连接元素的位置和空闲区域。

(例如,元素 1 连接到元素 72,元素 8 到 9 是空闲的)。

我选择 C ​​来编写代码,但我离逻辑还很远。

此外,用 C 编程变得越来越困难。我觉得可以使用正则表达式在 python 中轻松地完成此操作,或者可能是 perl,但我对这些语言没有太多经验。所以,如果有人能提供一种更简单的方法,那将是一个巨大的帮助。也欢迎改进 C 代码的想法。这是我的 C 代码:-

#include <stdio.h>

int main() {

char dot[500];
int i = 0, j = 0;
int count = 0, count1 = 0, count2 = 0;
int lhb[100];
int rhb[100];
int dots[100];
int pair_1[100];
int pair_2[100];
int pair_3[100];
FILE * fp;

fp = fopen("structure.txt", "r");

while (fscanf(fp, "%c", & dot[i]) != EOF) {

i++;
}

fclose(fp);

for (i = 0; dot[i] != '\0'; i++) {

if (dot[i] == '(') {
lhb[count] = dot[i];
pair_1[count] = i;
count++;
}
else if (dot[i] == '.') {
rhb[count1] = dot[i];
pair_2[count1] = i;
count1++;
}
else {
dots[count2] = dot[i];
pair_3[count2] = i;
count2++;
}
}


printf("Base-pair details :\n");

for (j = 0; j < count; j++)

printf("%d--%d\n", pair_1[j] + 1, pair_3[count - j - 1] + 1);

printf("Loop details :\n");

// for(j=0;j<=count;j++)

// printf("--%d-",pair_2[j]+1);

return 0;

}


最佳答案

这是一个可能的解决方案。 Free 包含一个索引每个点的列表,而 pairs 包含一个元组列表,这些元组具有每对的索引。这是在您的数据是完美的假设下运行的(即左右对的数量相同,左对之前没有右对。)但是,可以修改它以检查边缘情况。根据您的问题,我从 1 而不是 0 开始索引。

data = '(((((((..((((.....(..)))).((((.........)))).....(((((..)....))))))))))))....'

left = []
group = []
prev = ''

free = []
pairs = []

for index, elem in enumerate(data, 1):
if elem == '.' and prev == '.':
group.append(index)
elif elem == '.':
group = [index]
else:
if len(group) >= 1:
free.append(group)
group = []
if elem == '(':
left.append(index)
elif elem == ')':
pairs.append([left.pop(), index])
prev = elem
if len(group) > 0:
free.append(group)
pairs.sort()

输出:

[[1, 72], [2, 71], [3, 70], [4, 69], [5, 68], [6, 67], [7, 66], [10, 65], [11, 25], [12, 24], [13, 23], [19, 22], [27, 43], [28, 42], [29, 41], [30, 40], [49, 64], [50, 63], [51, 62], [52, 61], [53, 56]]
[[8, 9], [14, 15, 16, 17, 18], [20, 21], [26], [31, 32, 33, 34, 35, 36, 37, 38, 39], [44, 45, 46, 47, 48], [54, 55], [57, 58, 59, 60]]

代码通过对每个元素迭代一次来工作。如果遇到左括号,它会将索引附加到列表中。当它遇到右括号时,它会弹出最后看到的左括号的索引,从而创建一对。至于空闲点,跟踪前一个元素会告诉您如何处理每个点。如果已经看到了,则继续添加到当前列表中,否则开始一个新的列表。

关于python - 找出给定结构中的 RNA 碱基配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41066448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com