生成由一定数量的字符组成的字符串列表

2024-09-27 21:24:14 发布

您现在位置:Python中文网/ 问答频道 /正文

循环遍历字符串并生成所有字符串列表的最佳方法是什么?这些字符串与原始字符串之间的距离为某些字符,例如[ACGT]×X(小于字符串长度的整数)。你知道吗

例如,由2个字符变化的字符串'AGT'

"['AGCT']['AGCT']T", "A['AGCT']['AGCT']", "['AGCT']G['AGCT']"

现在我正在使用蛮力方法使用for循环来改变每个循环1个字符。基本上,我需要运行循环并创建一个新的列表,列出对字符串所做的更改的数量;例如,如果我想要2个更改,我需要运行循环2次,对于每个后续循环,我将使用上一个循环中的列表。你知道吗

sequences=['AGT','CGG']
l=[]
for sequence in sequences: 
    for i in range(len(sequence)):

        l.append( sequence[:i]+ 'C' +sequence[i+1:])
        l.append( sequence[:i]+ 'T' +sequence[i+1:])
        l.append( sequence[:i]+ 'G' +sequence[i+1:])
        l.append( sequence[:i]+ 'A' +sequence[i+1:])
new_lst=[]
for sequence in l: 
    for i in range(len(sequence)):

        new_lst.append( sequence[:i]+ 'C' +sequence[i+1:])
        new_lst.append( sequence[:i]+ 'T' +sequence[i+1:])
        new_lst.append( sequence[:i]+ 'G' +sequence[i+1:])
        new_lst.append( sequence[:i]+ 'A' +sequence[i+1:])

Tags: 方法字符串in列表newforlenrange
1条回答
网友
1楼 · 发布于 2024-09-27 21:24:14

我假设你不关心字符的插入或删除,只关心替换。你知道吗

据我所知,没有有效的方法来做这件事。这是一个指数问题。但是itertools能帮上忙。你知道吗

s成为要改变的字符串(例如“AGT”)。设variance为不同字符数(如2)。让alphabet成为允许的字符列表(例如“ACGT”)。你知道吗

首先,可以循环遍历所有可能随itertools.combinations(range(len(s)), r=variance)变化的索引组合。这会给你(0, 1)(0, 2)(1, 2),等等

下一步,您需要找出所有可以放置在这些位置的替换字母集。可以循环遍历与itertools.product(alphabet, repeat=variance)不同的字母。这将为您提供从字母表生成的长度为variance的元组。你知道吗

您可能希望确保用新字母替换字符串中的字母(例如,您不希望用'AG'替换'AGT'中的前两个字母)。所以,你可能想检查一下。你知道吗

以下代码将上述内容放在一起:

def replace(s, indices, replacement_letters):
    new_s = list(s)
    for (letter, idx) in zip(replacement_letters, indices):
        new_s[idx] = letter
    return ''.join(new_s)


def vary(s, variance, alphabet):
    # loop through the lists of positions that could differ in s
    for indices in itertools.combinations(range(len(s)), r=variance):
        # loop through lists of replacement letters for those positions
        for replacement_letters in \
                itertools.product(alphabet, repeat=variance):
            # check to make sure the replacement letters change s
            overlap = False
            for (letter, idx) in zip(replacement_letters, indices):
                if s[idx] == letter:
                    overlap = True
                    break
            if overlap:
                continue
            yield replace(s, indices, replacement_letters)


print(' '.join(vary('AGT', 2, 'GCAT')))
# GCT GAT GTT CCT CAT CTT TCT TAT TTT GGG GGC GGA CGG CGC CGA TGG TGC TGA ACG ACC ACA AAG AAC AAA ATG ATC ATA

潜在的改进:我很确定您可以使用不同的itertools方法来摆脱额外的检查步骤,以确保替换字母都实际更改了字符串。不管怎样,我希望这可以作为itertools方法的一个很好的演示,它可以在像这样的指数膨胀的情况下提供帮助。你知道吗

相关问题 更多 >

    热门问题