我在库瑟拉上跟踪生物信息学。我的一个同学用函数式编程来解决一个pattern_to_number问题:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from functools import reduce
def pattern_to_number(pattern):
code = dict(zip("ACGT",range(4)))
return reduce(lambda x,c: 4*x+code[c], pattern, 0)
print(pattern_to_number(sys.argv[1]))我就是这样在本地运行这个小程序的:
$ python3 ./pattern_to_number.py 'ATGCAA'
输出是(正确的):912
我理解lambda和reduce的使用。我不明白上面的功能解决方案如何能够模仿以下传统方法的功能。其中对i幂的4进行了计算。
for i, val in enumerate(pattern[::-1]):
total += dict[val] * (4**i)那么,λ的主体在哪里(或如何)计算4到code[c]的幂
发布于 2019-09-25 09:06:33
首先,让我们看一看约简函数:
reduce(lambda x,c: 4*x+code[c], pattern, 0)这将使当前值乘以4,并从模式中添加当前元素。把这个写出来会是这样的:
x=0 (初始值) c="A",结果是:4*x+code["A"] = code["A"]x=code["A"] (以前的结果) c="C",结果是`4*x+code"C“=4*代码”A“+ code"C"x=4*code["A"] + code["C"],c="G",结果是4*x+code["G"] = 4*(4*code["A"] + code["C"]) + code["G"] = 4**2 * code["A"] + 4 * code["C"] + code["G"]x=4**2 * code["A"] + 4 * code["C"] + code["G"],c="T",结果是4*x+code["T"] = 4*(4**2 * code["A"] + 4 * code["C"] + code["G"]) + code["T"] = 4**3 * code["A"] + 4**2 * code["C"] + 4 * code["G"] + code["T"]它对每个序列元素具有正确的4能力。
所以诀窍在于4*x函数的reduce,它最终将模式中的第一个元素乘以4,确切地说是len-1倍,第二个元素乘以4 len-2倍等等。
https://stackoverflow.com/questions/58094588
复制相似问题