我正试图反转我的stringtobin函数,以便当我运行bintostring([3])时,它将返回"AAAT"其中A=0,C=1,G=2,T=3,例如CCCC将返回85,因为(1 * 64)+(1 * 16)+(1 * 4)+(1 * 1)= 85。我的bintostring函数现在只返回一个空字符串。
dna = {'A':0, 'C':1, 'G':2, 'T':3}
dna2 = {0:'A', 1:'C', 2:'G', 3:'T'}
def bintostring(num):
seq = []
nums = [64,16,4,1]
#main while
i = 0
while i<len(num):
#nums while (iterate through nums)
k = 0
while k<len(nums):
#dna2 while (iterate through dna2)
x = 0
while x<len(dna2):
check = 0
if num[i]//nums[k] == dna2[x]:
seq.append(dna2[x])
check+=1
elif check>0:
seq.append('A')
x+=1
k+=1
i+=1
return("".join(seq))
print(bintostring([3]))
def stringtobin(seq):
power_of_4 = 1
num = 0
if len(seq)!=4: return None
i = len(seq)-1
while i>=0:
power_of_4*=4
Digitval = dna[seq[i]]
num+=Digitval*power_of_4//4
i-=1
return num
print(stringtobin("AAAT"))
你的编码是进制的,不能保存序列的长度信息。
如果没有长度信息,编码值3可能表示T或TA或TAAA或TAAAA…(没有办法知道)。
如果序列总是4个字母长(或者长度是单独存储/提供的),您可以实现如下函数
def stringToBin(S):
return sum( 4**i*"ACGT".index(p) for i,p in enumerate(S))
def binToString(N,size=4):
result = ""
for _ in range(size):
N,p = divmod(N,4)
result += "ACGT"[p]
return result
print(stringToBin("AAAT")) # 192
print(binToString(192)) # AAAT
print(stringToBin("TA")) # 3
print(stringToBin("TAAA")) # 3
print(binToString(3)) # TAAA
print(binToString(3,2)) # TA (length has to be supplied separately)
如果您希望您的数字编码也携带长度信息,您应该将其设为基数5,并为每个字母使用非零值。这样,TA和TAAA就会给出不同的数字。
def stringToBin(S):
return sum( 5**i*" ACGT".index(p) for i,p in enumerate(S))
def binToString(N):
result = ""
while N:
N,p = divmod(N,5)
result += " ACGT"[p]
return result
print(stringToBin("TA")) # 9
print(stringToBin("TAAA")) # 159
print(binToString(9)) # TA
print(binToString(159)) # TAAA
显然,这会产生更大的数字,因此,32位无符号整数将只包含13个字母,而不是以4为基数的16个字母。如果您这样做是为了减少存储大小,使用文本压缩(例如zip)可能比转换为固定基数二进制表示
更有效。你的尝试似乎异常复杂。只需将底部的两位映射为一个值,然后将它们移开。
def bintostring(num):
seq = []
for n in num:
subseq = []
for b in range(4):
subseq.append(dna2[n & 3])
n >>= 2
seq.append("".join(reversed(subseq)))
return seq
在不明显的情况下,&
是位与;value & 3
得到value
的底部两位
stringtobin
函数可以类似地简化。演示:https://ideone.com/RlzegN