Python 如何修改以下程序,以确保其替换的每个字母都是唯一的?

Python 如何修改以下程序,以确保其替换的每个字母都是唯一的?,python,string,random,Python,String,Random,我写了一个程序,它获取了一个由3个字母组成的字符串列表(对于那些了解生物学的人来说,也称为密码子),对于每个字符串,它将从3个字母中选择任意一个(随机),并将该字母替换为a、G、C或T(随机)。例如:对于字符串GCT,它将随机选择3个位置中的任意一个,即C,然后将其随机更改为A、G、C或T,即T。因此生成的新字符串(或密码子)将是GTT,依此类推,用于列表上的下一个字符串 然而,有一个问题。我编写它的方式没有检查以确保它生成的新字符串与旧字符串不同。因此,如果程序随机选择将字母更改为与初始字母相

我写了一个程序,它获取了一个由3个字母组成的字符串列表(对于那些了解生物学的人来说,也称为密码子),对于每个字符串,它将从3个字母中选择任意一个(随机),并将该字母替换为a、G、C或T(随机)。例如:对于字符串GCT,它将随机选择3个位置中的任意一个,即C,然后将其随机更改为A、G、C或T,即T。因此生成的新字符串(或密码子)将是GTT,依此类推,用于列表上的下一个字符串

然而,有一个问题。我编写它的方式没有检查以确保它生成的新字符串与旧字符串不同。因此,如果程序随机选择将字母更改为与初始字母相同的字母,那么它将偶然输出相同的字符串,即再次将C从GCT转换为C并生成GCT。我想确保这不会发生,这样程序就不会生成相同的字符串,因为在分析数十万个密码子/字符串时,这是随机发生的。我试图通过在for循环的第二行中使用list(A,G,T,C)-密码子[index]来实现这一点,但没有成功

我不会用整个代码来打扰您,但最初我只是打开了列出我的密码子/字符串的文件(在一列中),并将所有密码子/字符串添加到一个列表中,并将其命名为“密码子”。以下是剩下的:

import random 
def string_replace(s,index,char):
return s[:index] + char + s[index+1:]

for x in range(1,10):   # I set the range to 10 so that I can manually check if the program worked properly 
    index = random.randrange(3)
    letter_to_replace = random.choice(list({"A", "G", "T", "C"} - {codon[index]}))
    mutated_codon = [string_replace(codon[x], index, letter_to_replace)]   
    print mutated_codon) 

编辑函数,让你的代码在那里,而不是在那里,给索引替换那里, 我不知道如何创建密码子列表,但这里我有一个例子

listofcodons=["ATC", "AGT", "ACC"]
for s in listofcodons:
    index=random.randrange(3)
    mutated=string_replace(s,index)
    print mutated


def string_replace(s,index):
        codonset=set(["A","C","G","T"])
        toreplace=s[index]
        #codonset.pop(toreplace)
        codonset.remove(toreplace)            
        char=random.choice(codonset)
        return s[:index] + char + s[index+1:]

编辑函数,让你的代码在那里,而不是在那里,给索引替换那里, 我不知道如何创建密码子列表,但这里我有一个例子

listofcodons=["ATC", "AGT", "ACC"]
for s in listofcodons:
    index=random.randrange(3)
    mutated=string_replace(s,index)
    print mutated


def string_replace(s,index):
        codonset=set(["A","C","G","T"])
        toreplace=s[index]
        #codonset.pop(toreplace)
        codonset.remove(toreplace)            
        char=random.choice(codonset)
        return s[:index] + char + s[index+1:]
-->如果密码子是由3个字母字符串组成的列表,则这将是一个3个字母的代码 你想要密码子[x][index]

-->如果密码子是由3个字母字符串组成的列表,则这将是一个3个字母的代码
如果您想要密码子[x][index]

您可以使用while循环:

import random

mutated_codon=codon='GCT'

while mutated_codon==codon:
    li=list(mutated_codon)
    li[random.choice([0,1,2])]=random.choice(["A", "G", "T", "C"]) 
    mutated_codon = ''.join(li) 

print codon, mutated_codon     

您可以使用while循环:

import random

mutated_codon=codon='GCT'

while mutated_codon==codon:
    li=list(mutated_codon)
    li[random.choice([0,1,2])]=random.choice(["A", "G", "T", "C"]) 
    mutated_codon = ''.join(li) 

print codon, mutated_codon     

像这样的怎么样

#!/usr/local/cpython-3.3/bin/python

import random

def yield_mutated_codons(codon):
    possible_set = set({"A", "G", "T", "C"})

    for x in range(1, 10):
        index = random.randrange(3)
        letter_to_replace = codon[index]
        current_set = possible_set - set(letter_to_replace)
        codon[index] = random.choice(list(current_set))
        yield ''.join(codon)

def main():
    codon = list('GAT')

    for mutated_codon in yield_mutated_codons(codon):
        print(mutated_codon)

main()

像这样的怎么样

#!/usr/local/cpython-3.3/bin/python

import random

def yield_mutated_codons(codon):
    possible_set = set({"A", "G", "T", "C"})

    for x in range(1, 10):
        index = random.randrange(3)
        letter_to_replace = codon[index]
        current_set = possible_set - set(letter_to_replace)
        codon[index] = random.choice(list(current_set))
        yield ''.join(codon)

def main():
    codon = list('GAT')

    for mutated_codon in yield_mutated_codons(codon):
        print(mutated_codon)

main()

所以我觉得很无聊,决定给它编代码(可以短一些,但在这里我很满意)

a
可以是您的密码子列表,
b
将是一个密码子列表,其中一个随机索引被一个随机(从不相同)字母替换

可以回答您的新问题:

from random import choice as c
codons = ['ACT','ATT','GCT']
f=lambda s,i:s[:i]+c(list(set(['A','G','C','T'])-set(s[i])))+s[i+1:]
mutated_codons = [f(s,c([0,1,2]))for s in codons]

for codon in mutated_codons:
try:
    print codon, codon_lookup[codon]
except KeyError, e:
    print e

假设您的字典名为
condon_lookup
,这将打印每个突变密码子,然后再进行氨基酸查找。你的旧代码在每个变异密码子的字母上循环,而不是像你想的那样在密码子列表上循环。

所以我觉得很无聊,决定对它进行编码(可能更短,但在这里很满意)

a
可以是您的密码子列表,
b
将是一个密码子列表,其中一个随机索引被一个随机(从不相同)字母替换

可以回答您的新问题:

from random import choice as c
codons = ['ACT','ATT','GCT']
f=lambda s,i:s[:i]+c(list(set(['A','G','C','T'])-set(s[i])))+s[i+1:]
mutated_codons = [f(s,c([0,1,2]))for s in codons]

for codon in mutated_codons:
try:
    print codon, codon_lookup[codon]
except KeyError, e:
    print e


假设您的字典名为
condon_lookup
,这将打印每个突变密码子,然后再进行氨基酸查找。你的旧密码是在每个变异密码子的字母上循环,而不是像你想的那样在密码子列表上循环。

那么一个
while
循环怎么样?@dawg你能详细说明一下它是如何工作的吗?那么一个
while
循环怎么样?@dawg你能详细说明一下它是如何工作的吗?你还有其他方法可以做到这一点,但我认为这可能是更清晰的方法之一。虽然您的意思是
codstart.remove(toreplace)
而不是
pop
-
pop
不接受参数。我不是必须在for循环中输入mutated=string\u replace(s,index)才能遍历每个字符串吗?当我尝试这样做时,它不起作用,因为它说“名称”没有定义。@bioprogammer,嗯,是的,我想你会弄明白这些事情,所以,这对密码子串起作用,你会循环那个密码子列表。这个函数需要应用于每个3个字母的密码子,是的。一个for循环是一种方法。看看这个s来自哪里,它在密码子列表的循环中。还有其他方法可以做到,但我认为这可能是更清晰的方法之一。虽然您的意思是
codstart.remove(toreplace)
而不是
pop
-
pop
不接受参数。我不是必须在for循环中输入mutated=string\u replace(s,index)才能遍历每个字符串吗?当我尝试这样做时,它不起作用,因为它说“名称”没有定义。@bioprogammer,嗯,是的,我想你会弄明白这些事情,所以,这对密码子串起作用,你会循环那个密码子列表。这个函数需要应用于每个3个字母的密码子,是的。for循环是实现这一点的一种方法。看看编辑它的来源,它在密码子列表+1的循环中。我想就是这样:你目前的方法对我来说似乎很好,除了托兰吉提到的小问题。@FrerichRaabe感谢你的输入。我加入了这个变化,但有一个小问题。当我手动检查输出时,程序对大多数密码子都像预期的那样工作,但对于其中一个密码子,输出与初始字符串相同,但对于紧跟在列表中该密码子之后的字符串,它从该字符串中切换了2个字母,而不是1+1。我想就是这样:我觉得你目前的方法很好,除了托兰吉提到的小问题。@FrerichRaabe谢谢你的意见。我加入了这个变化,但有一个小问题。当我手动检查输出时,程序对大多数密码子都像预期的那样工作,但对于其中一个密码子,输出与初始字符串相同,但对于紧跟在列表上的字符串之后的字符串,它从该字符串中切换了2个字母,而不是1个。还有一个问题。每一个密码