【问题标题】:Going to a certain position in a string [closed]转到字符串中的某个位置[关闭]
【发布时间】:2012-04-28 02:07:17
【问题描述】:

我想到达与给定的字符串相反(从负端)的字符串上的某个点。

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊! TTTTTTTTTTGGGGGGGGGGAAAAAAAAAACCCCCCCCCC

所以你需要转换坐标。在底链上,碱基 0(最右边的 C)与顶链上的碱基 39 相对。以 1 为底数以 38 为底。以 2 为底数以 37 为底。(重要一点:注意每次将这两个数字相加时会发生什么。)因此以 10 为底数以 29 为底数,以 19 为底数以 20 为底数。

所以:如果我想在底部链上找到基数 10-20,我可以查看顶部的基数 20-29(然后反向补码)。

我写了以下内容:

fp = open(infile, 'r')
for line in fp:
   tokens = line.split()
   exonstarts = tokens[8][:-1].split(',')
   exonends = tokens[9][:-1].split(',')
   zipped = list(zip(exonstarts, exonends))
   chrom_len = len(chr_string)
   s = ''.join(bc[base.upper()] for base in chr_string[-starts-1:-ends-1] for starts, ends in zipped)+'\n'

然而,每次我这样做我都会得到:

错误:未定义全局名称“starts”

我该如何解决这个问题??

【问题讨论】:

  • 我应该如何定义开始?
  • Exonstarts 指的是一个列表...我希望每对的第一个元素都以 [(1,2),(3,4),(5,6)] (这个列表是我定义为“压缩”的)开始将是 1,然后是 3 和 5,而结束是对中的另一个数字
  • 我认为将此代码与“开始,以压缩结束”一起使用对我来说是这样的,因为每个括号内的两个元素是开始,结束......
  • 我正在经历的字符串
  • 如果你继续在这里定义它会非常有帮助,而不是使用 line in fp 可能将 fp 定义为多行字符串并使用 for line in fp.split('\n'): 以便我们可以尝试运行它。

标签: python string coordinates


【解决方案1】:

尝试在最后一个术语周围添加括号:

s = ''.join(bc[base.upper()] for base in (chr_string[-starts-1:-ends-1]\
                                         ^
            for starts, ends in zipped)) +'\n'
                                      ^

您在这里定义了两个不同的生成器。这相当于:

strands = (chr_string[-starts-1:-ends-1] for starts, ends in zipped)
complementary_strands = (bc[base.upper()] for base in stage_1)
joined_exons = ''.join(stage_2) + '\n'

【讨论】:

  • 我也试试看,看看我的想法
  • 将其分为三个阶段肯定是要走的路 (+1),但这些阶段的名称应该比 _1、_2、_3 更有意义。
  • 好的,听起来不错。我的最后一个是否也需要分解,还是按原样进行? if strand == '+': s = ''.join([chr_string[starts:ends] 用于开始,以压缩结束])
  • 分解它有助于提高可读性并帮助您找出代码的问题所在。如果需要,您可以将其保留为一种表达方式。它不影响发电机的功能。这取决于你
  • \ 换行没有必要也没有帮助。
【解决方案2】:

看起来您在 生成器表达式中做了太多事情。

这两个fors 是错误的。你的意思是:

s = ''.join(bc[base.upper()] for starts,ends in zipped for base in chr_string[-starts-1:-ends-1])+'\n'

然后为第二个for定义startsends

鉴于您今天提出的问题,我建议您阅读a good book,例如Dive Into Python 3,以便您自己解决这些问题。

【讨论】:

  • 哈哈,谢谢,我去看看。所有这些对我来说都很新鲜
  • @skyl:我没有做出这样的暗示。本书推荐旨在提供帮助,显然帕特里克还没有读过一本关于 Python 的好书。
  • @PatrickCampbell 您已经知道如何使用int(start) 将字符串转换为整数,您自己在对另一个答案的评论中做到了!
  • @PatrickCampbell:请停止在任意答案的 cmets 中提出新问题;这不是这个社区的运作方式。
  • @PatrickCampbell 在继续之前,您真的应该接受 Johnsyweb 的建议并阅读 Python 书籍或教程。当您似乎根本不了解该语言如何组合在一起时,很难为您提供帮助。
【解决方案3】:

您正在定义外显子开始,然后引用未定义的开始。

【讨论】:

  • Exonstarts 指的是一个列表...我希望每对的第一个元素都以 [(1,2),(3,4),(5,6)] 开始将是 1,然后是 3 和 5,而末端将是一对中的另一个数字
  • 它已经定义好了,你可能做了和我一开始一样的事情,并且没有滚动看到那长线的结尾......
猜你喜欢
  • 1970-01-01
  • 2016-07-10
  • 2016-08-04
  • 2014-11-02
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 2014-05-12
  • 2012-06-22
相关资源
最近更新 更多