迭代地更改字符串

时间:2018-04-30 13:00:22

标签: python string

我正在尝试用Python编写一个脚本,它接受一个字符串并通过迭代移动原始序列中的字母来返回字符串列表。

例如:ACGT - > TACG - > GTAC - > CGTA - > STOP(原始序列)

我是编程的初学者,这是我成功做的事情

liste=[]
seq=list('ACGT')
nseq=list("test")
while nseq!=seq:
    for i in range (0, len(seq)):
        nseq[i]=seq[i-1]
        ''.join(nseq)
        liste.append(nseq)

它只返回像TACG这样的第一步,并且不会继续。

输出:['T', 'A', 'C', 'G']多次(无限循环)

预期产出:

TACG GTAC CGTA

7 个答案:

答案 0 :(得分:3)

基本上,您需要将最后一个元素移动到开头,直到您进入原始序列。对于此collections.deque及其rotate()方法(相当于module: { rules: [ { test: require.resolve("pace-progress"), loader: "imports-loader?define=>false" } ] } )应该是最有效的方法:

d.appendleft(d.pop())

演示:

from collections import deque

def rotations(s):
    yield s
    d = deque(s)

    for _ in range(len(d) - 1):
        d.rotate(1)
        yield ''.join(d)

答案 1 :(得分:3)

没有任何导入的简单解决方案。

def rot(s, n):
    return s[-n:] + s[:-n]

for i in range(4):
    print(rot('ACGT', i))

<强>输出

  

ACGT

     

TACG

     

GTAC

     

CGTA

答案 2 :(得分:2)

list = []
seq = "ACGT"
for i in range(len(seq), 0, -1):
    list.append(seq[i:]+seq[:i])
# list = ['ACGT', 'TACG', 'GTAC', 'CGTA']

答案 3 :(得分:2)

一种选择是使用collections.dequerotate

from collections import deque

def rotator(x):
    yield x
    y = deque(x)
    for _ in range(len(y)-1):
        y.rotate(1)
        yield ''.join(y)

res = list(rotator('ACGT'))

print(res)

['ACGT', 'TACG', 'GTAC', 'CGTA']

答案 4 :(得分:2)

def move_letter_forward(string):
    str_list = [string]
    for i in range(len(string) - 1):
        str_list.append(str_list[-1][-1] + str_list[-1][:-1])
    return str_list

如果您希望输出为:

TACG
GTAC
CGTA

以上代码可以更改为:

def move_letter_forward(string):
    str_list = [string]
    for i in range(len(string) - 1):
        str_list.append(str_list[-1][-1] + str_list[-1][:-1])
    return str_list[1:]
for string in move_forward('ACGT'):
        print(string)

答案 5 :(得分:1)

如果您只需要旋转打印,请查看:

>>> s = 'ACGT'
>>> '-->'.join(s[i:]+s[0:i] for i in range(len(s),0,-1))
'ACGT-->TACG-->GTAC-->CGTA'

如果您需要在列表中省略'-->'.join部分:

>>> rotations = [s[i:]+s[0:i] for i in range(len(s),0,-1)]
>>> rotations
['ACGT', 'TACG', 'GTAC', 'CGTA']

答案 6 :(得分:0)

这可以使用队列数据结构来实现。

这是一般版本

  1. 弹出最后一个索引的元素

  2. 将元素推送到第一个索引

  3. 重复输入字符串的长度。
  4. 我将实现留给您,将其用作参考Queue DS in python

    这是实施 代码

    from collections import deque
    ip = 'ACGT'
    d = deque(ip)
    
    for i in range(len(ip)):
        temp = d.pop()
        d.appendleft(temp)
        print(''.join(d))
    
    
    OUTPUT
    TACG
    GTAC
    CGTA
    ACGT