如何组合周期序列

cgh8pdjw  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(411)

我有一个dna序列,比如 CCG ACG GCA CTG GGC CAG TTG .
我想在不改变每个子集的顺序的情况下,对这个序列进行所有可能的组合(比如说ccg应该是ccg)。例如,修改后的序列可以是

ACG CCG GCA CTG GGC CAG TTG   # Here the first two sub-sets are interchanged.
GCA ACG CCG CTG GGC CAG TTG   # Here the first and third sub-sets are interchanged.

有没有简单的方法可以使用shell脚本或python代码来提供所有可能的组合?
在每种可能的组合中,它都将涵盖这七个子集。

fdx2calv

fdx2calv1#

您可以使用itertools中的前提条件,例如:

import itertools

dna = "CCG ACG GCA CTG GGC CAG TTG"
dna = dna.split()

for combination in itertools.permutations(dna):
    print(combination)

我首先做了一个split(),它创建了一个由空格分隔的原始dna字符串数组,如下所示:

['CCG', 'ACG', 'GCA', 'CTG', 'GGC', 'CAG', 'TTG']

然后使用itertools.permutation()返回该数组索引的所有组合。

qlckcl4x

qlckcl4x2#

虽然比python版本慢很多,但是 bash 打印其参数排列的脚本:


# !/usr/bin/env bash

shopt -s lastpipe

permutations() {
    if [[ $# -gt 1 ]]; then
        local -a elems=( "$@" )
        local i curr result
        for (( i = 0; i < $#; i++ )); do
            curr="${elems[i]}"
            unset "elems[i]"
            permutations "${elems[@]}" | while read -r result; do
                printf "%s %s\n" "$curr" "$result"
            done
            elems[i]="$curr"
        done
    elif [[ $# -eq 1 ]]; then
        printf "%s\n" "$1"
    fi
}

permutations "$@"

它只是使用一种简单的递归方法来计算列表的所有排列。

$ bash perms.sh CCG ACG GCA CTG GGC CAG TTG
CCG ACG GCA CTG GGC CAG TTG
CCG ACG GCA CTG GGC TTG CAG
CCG ACG GCA CTG CAG GGC TTG
CCG ACG GCA CTG CAG TTG GGC
CCG ACG GCA CTG TTG GGC CAG
CCG ACG GCA CTG TTG CAG GGC
...
many more lines
...
TTG CAG GGC CTG GCA ACG CCG
$

相关问题