【问题标题】:Python3: List of strings, where strings having variable letters (not all letters at not all positions)Python3:字符串列表,其中字符串具有可变字母(并非所有位置的所有字母)
【发布时间】:2018-04-22 06:16:33
【问题描述】:

首先是一些生物学背景,这样你就明白我的问题了。在生物学中,DNA 序列可以包含被酶或蛋白质识别的基序。这些主题是字符串,例如“GACTGC”。分析可以揭示基序中的位置是否“保守”。

酶可能最能识别“GACTGC”,但也可能识别“CACTGC”甚至“TTCTGC”。所以,有些职位可能会有所不同。

我有以下情况: 我想创建一个可以识别的带有图案的排列列表。为此,我有以下信息:

最佳认可:GACTGC

碱基,也是可能的:

GACTGC
A  C G
T    A

这意味着,在第一个位置,也可能有 A 或 T,在第 4 个位置可能有一个 C 等等,但在第 2 个位置,A 是守恒的,没有其他可能。

我可以通过将“最适合”主题转换为字母列表并替换一个字母,加入并附加到我的列表(为每个位置执行此操作)来生成一个列表,其中每个位置都有一个不同的碱基。所以它基本上是硬编码的。 它成功了,因为我改变了任何位置,无论输入什么主题。 但现在我想根据主题将特定位置更改为特定字母并仅存储特定排列。

因此,我正在寻找最短/最快/可能最聪明的方法,以传递位置信息及其有效字母,以及如何为一个和两个可变位置创建排列。

请注意:我会尝试在答案中或通过编辑发布我的代码,以某种方式复制粘贴,然后在标记的代码上按 ctrl+k 不起作用

【问题讨论】:

    标签: python string python-3.x replace


    【解决方案1】:

    可能有一种方法可以使用 itertools 解决这个问题,但我认为使用自制的置换函数可以足够快地完成:

    example_bases = [
      "GAT",  # options for first position
      "A",    # options for second position
      "C",    # ...
      "TC",
      "G",
      "CGA"
    ]
    
    def permutate(bases, results, depth=0, current_result=""):
    """Create permutations of a list of strings
    
    All resulting strings have the length len(bases), and there will be a total
    of mult([len(options) for option in bases]) total results, e.g.:
    ["abc", "de", "fghi"] -> 3 * 2 * 4 -> 24
    
    :param bases: List of possible options for a base
    :param results: The object which will contain all valid results
    :param depth: Internal counter for current recursive depth 
    :param current_result: Internal variable to keep track of progress 
    """
      if depth == len(bases):
        results.append(current_result)
      else:
        for base in bases[depth]:
          permutate(bases, results, depth+1, current_result+base)
    
    example_results = []
    permutate(example_bases, example_results)
    for sequence in example_results:
      print(sequence)
    

    打印此特定示例的 18 种可能组合:

    GACTGC
    GACTGG
    GACTGA
    GACCGC
    GACCGG
    GACCGA
    AACTGC
    AACTGG
    AACTGA
    AACCGC
    AACCGG
    AACCGA
    TACTGC
    TACTGG
    TACTGA
    TACCGC
    TACCGG
    TACCGA
    

    如果您不喜欢递归,或者您对代码有疑问,请随时提问。

    【讨论】:

    • 非常感谢!你的假设是正确的,递归不是我的事,但我认为,我能够追溯它!我本不可能自己编出来的,但我希望我能记住它,当我将来遇到同样的问题时:)
    • 乐于助人,祝你好运 =)
    • 我是这样理解的:组合是由为位置提供的字符串组成的。如果只遇到一个字母,它被“添加”,我们可以继续下一个位置。但是如果遇到更多的字母,则对字母的第一个选项进行处理,然后进行到最后,然后在下一步中,我们在字母的下一个选项中。这样就完成了,直到我们为最后一个选项执行此操作并继续到下一个位置
    • 正确。我认为,如果您记下深度计数器在代码执行的不同阶段具有的值,结果就不会太令人惊讶。就我个人而言,递归是最容易理解的,如果我能把它想象成深度优先搜索en.wikipedia.org/wiki/Depth-first_search
    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 2014-04-26
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多