python:生成 Kolakoski 序列,可以转换为DNA序列

Kolakoski 序列是一个仅由1和2组成的无限数列,是一种通过“自描述”来定义的数列。

Kolakoski 序列是一个分形数列:如果将相邻相同的数字组成一组,那么...
如果把每一组数用它的长度来替换,就会得到这个数列本身。

Kolakoski 序列前几项为:1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,...
( sequence A000002 in the OEIS )

DNA序列的构成基于四种特定的碱基,分别是腺嘌呤(A)、胸腺嘧啶(T)、鸟嘌呤(G)和胞嘧啶(C)。这些碱基以特定的配对方式形成碱基对,即A与T配对,C与G配对,这是基于它们之间的氢键相互作用。每个碱基代表一个特定的遗传信息,通过这些碱基的排列顺序,DNA序列能够编码遗传信息,进而指导生物体的生长、发育和功能。(在RNA序列中,U取代了DNA序列中的T)

1990年日本学者间中喜雄将嘌呤类假定为阴(A 太阴 和 G 少阴),嘧啶类假定为阳(T 太阳 和 C少阳),应用到遗传密码表中解读易学,结果表示氨基酸的三联体惊人地与“易经八卦”相对应。

假设 1为阳爻,2为阴爻,那么可以转换为DNA序列。

编写 kolakoski-DNA.py  如下

# -*- coding: utf-8 -*-
""" Kolakoski序列是一个仅由1和2组成的无限数列,是一种通过“自描述”来定义的数列。
    Kolakoski序列是一个分形数列。
"""
n = 100
alist = [1,2,2]
prev = 2
tail = 3
a = 1
while tail < n:
    for i in range(0,alist[prev]):
        alist.append(a)
        tail += 1
    a = a^3 # 按位异或
    prev += 1
# 输出 Kolakoski序列
#print(alist)

blist = []
b = 0
for i in range(0,n):
    if i %2 == 0:
        b = alist[i]*10
    else:
        b += alist[i]
        blist.append(b)
# 输出每2位数,组成一组
print(blist)

clist = []
for b in blist:
    if b == 11:
        clist.append('T')
    elif b == 12:
        clist.append('C')
    elif b == 21:
        clist.append('G')
    elif b == 22:
        clist.append('A')
    else:
        clist.append('?')
# 输出 伪造DNA序列
print(clist)
print(''.join(clist))
# 输出每3位一组
for i in range(0, len(clist)):
    if i %3 == 0 and i >0:
        print(',',  end='')
    print(clist[i], end='')

运行 python kolakoski-DNA.py 

[12, 21, 12, 12, 21, 22, 11, 21, 12, 21, 21, 12, 12, 21, 12, 11, 21, 22, 12, 21, 12, 12, 21, 21, 12, 11, 22, 12, 21, 12, 12, 21, 22, 11, 21, 12, 12, 21, 21, 12, 21, 22, 11, 21, 22, 12, 21, 12, 11, 22]
['C', 'G', 'C', 'C', 'G', 'A', 'T', 'G', 'C', 'G', 'G', 'C', 'C', 'G', 'C', 'T', 'G', 'A', 'C', 'G', 'C', 'C', 'G', 'G', 'C', 'T', 'A', 'C', 'G', 'C', 'C', 'G', 'A', 'T', 'G', 'C', 'C', 'G', 'G', 'C', 'G', 'A', 'T', 'G', 'A', 'C', 'G', 'C', 'T', 'A']
CGCCGATGCGGCCGCTGACGCCGGCTACGCCGATGCCGGCGATGACGCTA
CGC,CGA,TGC,GGC,CGC,TGA,CGC,CGG,CTA,CGC,CGA,TGC,CGG,CGA,TGA,CGC,TA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值