gpt4 book ai didi

python - 将密码子(64 进制)转换为 10 进制数

转载 作者:太空狗 更新时间:2023-10-30 00:08:02 25 4
gpt4 key购买 nike

在 2012 年 7 月的“Mensa Bulletin”中,有一篇题为“数字大脑”的文章。在其中,作者将人脑与 base64 计算联系起来。这是一篇相当有趣和有趣的文章,最后有一个提示。所述提示要求读者使用胞嘧啶胞嘧啶鸟嘌呤胞嘧啶腺嘌呤鸟嘌呤等于 2011 的事实将胞嘧啶鸟嘌呤腺嘌呤鸟嘌呤腺嘌呤鸟嘌呤转换为基数 10(提到的第一个密码子集简称为 cgagag,第二个密码子集简称为 ccgcag。)基本上您必须使用文章中的表格将基数 64 转换为基数 10,该表格以正确的顺序显示所有可能的密码子,其中 aug = 0, uuu = 1, uuc = 2, ..., gga == 61, ggg = 62,uag = 63。我决定试一试,并决定编写一个 python 程序,将密码子数转换为 10 进制,并将 10 进制数转换为密码子。在为两者编写了一个快速算法后,我运行了它。该程序没有给出任何错误,并为我的数字弹出了密码子,反之亦然。然而,他们是错误的数字!我似乎看不出出了什么问题,非常感谢任何帮助。

废话不多说,上代码:

codons = ['aug', 'uuu', 'uuc', 'uua', 'uug', 'ucu', 'ucc', 'uca', 'ucg', 'uau', 'uac', 'uaa', 'ugu', 'ugc', 'uga', 'ugg', 'cuu', 'cuc', 'cua', 'cug', 'ccu', 'ccc', 'cca', 'ccg', 'cau', 'cac', 'caa', 'cag', 'cgu', 'cgc', 'cga', 'cgg', 'auu', 'auc', 'aua', 'acu', 'acc', 'aca', 'acg', 'aau', 'aac', 'aaa', 'aag', 'agu', 'agc', 'aga', 'agg', 'guu', 'guc', 'gua', 'gug', 'gcu', 'gcc', 'gca', 'gcg', 'gau', 'gac', 'gaa', 'gag', 'ggu', 'ggc', 'gga', 'ggg', 'uag' ]

def codonNumToBase10 ( codonValue ) :

numberOfChars = len( codonValue )

# check to see if contains sets of threes
if len( codonValue ) % 3 != 0 :
return -1

# check to see if it contains the correct characters
for i in range(0, numberOfChars ) :
if codonValue[i] != 'a' :
if codonValue[i] != 'u' :
if codonValue[i] != 'c' :
if codonValue[i] != 'g' :
return -2

# populate an array with decimal versions of each codon in the input
codonNumbers = []
base10Value = 0
numberOfCodons = int(numberOfChars / 3 )
for i in range(0, numberOfCodons) :
charVal = codonValue[ 0 + (i*3) ] + codonValue[ 1 + (i*3) ] + codonValue[ 2 + (i*3) ]
val = 0
for j in codons :
if j == charVal :
codonNumbers.append( val )
break
val += 1
base10Value += ( pow( 64, numberOfCodons - i - 1 ) ) * codonNumbers[i]

return base10Value

def base10ToCodonNum ( number ) :
codonNumber = ''
hitZeroCount = 0
while( 1==1 ) :
val = number % 64
number = int( number / 64 )
codonNumber = codons[val] + codonNumber
if number == 0 :
if hitZeroCount > 0:
break
hitZeroCount += 1
return codonNumber

val_2011 = 'ccgcag'
val_unknown = 'cgagag'

print( base10ToCodonNum( codonNumToBase10( val_2011 ) ), '::', codonNumToBase10( val_2011 ) )
print( base10ToCodonNum( codonNumToBase10( val_unknown ) ), '::', codonNumToBase10( val_unknown ) )

编辑 1:我得到的值是 ccgcag 的 1499 和 cgagag 的 1978。

编辑 2:感谢 Ashwini Chaudhary,修复了 base10ToCodonNum 函数。

最佳答案

我无法遵循您的代码,所以我做了另一个实现,但我得到了相同的结果:

CODONS = [
'aug', 'uuu', 'uuc', 'uua', 'uug', 'ucu', 'ucc', 'uca',
'ucg', 'uau', 'uac', 'uaa', 'ugu', 'ugc', 'uga', 'ugg',
'uuu', 'cuc', 'cua', 'cug', 'ccu', 'ccc', 'cca', 'ccg',
'cau', 'cac', 'caa', 'cag', 'cgu', 'cgc', 'cga', 'cgg',
'auu', 'auc', 'aua', 'acu', 'acc', 'aca', 'acg', 'aau',
'aac', 'aaa', 'aag', 'agu', 'agc', 'aga', 'agg', 'guu',
'guc', 'gua', 'gug', 'gcu', 'gcc', 'gca', 'gcg', 'gau',
'gac', 'gaa', 'gag', 'ggu', 'ggc', 'gga', 'ggg', 'uag',
]

def codon2decimal(s):
if len(s) % 3 != 0:
raise ValueError("%s doesn't look like a codon number." % s)
digits = reversed([ s[i*3:i*3+3] for i in range(len(s)/3) ])
val = 0
for i, digit in enumerate(digits):
if digit not in CODONS:
raise ValueError("invalid sequence: %s." % digit)
val += CODONS.index(digit) * 64 ** i
return val

def main():
for number in ('cggcag', 'ccgcag', 'cgagag', 'auguuuuuc'):
print number, ':', codon2decimal(number)

if __name__ == '__main__':
main()

结果:

cggcag : 2011
ccgcag : 1499
cgagag : 1978
auguuuuuc : 66

关于python - 将密码子(64 进制)转换为 10 进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11357285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com