Python 如何修改以下程序,以确保其替换的每个字母都是唯一的?
我写了一个程序,它获取了一个由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]来实现这一点,但没有成功 我不会用整个代码来打扰您,但最初我只是打开了列出我的密码子/字符串的文件(在一列中),并将所有密码子/字符串添加到一个列表中,并将其命名为“密码子”。以下是剩下的:Python 如何修改以下程序,以确保其替换的每个字母都是唯一的?,python,string,random,Python,String,Random,我写了一个程序,它获取了一个由3个字母组成的字符串列表(对于那些了解生物学的人来说,也称为密码子),对于每个字符串,它将从3个字母中选择任意一个(随机),并将该字母替换为a、G、C或T(随机)。例如:对于字符串GCT,它将随机选择3个位置中的任意一个,即C,然后将其随机更改为A、G、C或T,即T。因此生成的新字符串(或密码子)将是GTT,依此类推,用于列表上的下一个字符串 然而,有一个问题。我编写它的方式没有检查以确保它生成的新字符串与旧字符串不同。因此,如果程序随机选择将字母更改为与初始字母相
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个。还有一个问题。每一个密码