首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这段代码如何计算4到<exponent>的幂

这段代码如何计算4到<exponent>的幂
EN

Stack Overflow用户
提问于 2019-09-25 08:47:58
回答 1查看 107关注 0票数 4

我在库瑟拉上跟踪生物信息学。我的一个同学用函数式编程来解决一个pattern_to_number问题:

代码语言:javascript
复制
#!/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

我理解lambdareduce的使用。我不明白上面的功能解决方案如何能够模仿以下传统方法的功能。其中对i幂的4进行了计算。

代码语言:javascript
复制
for i, val in enumerate(pattern[::-1]):
        total += dict[val] * (4**i)

那么,λ的主体在哪里(或如何)计算4到code[c]的幂

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-25 09:06:33

首先,让我们看一看约简函数:

代码语言:javascript
复制
reduce(lambda x,c: 4*x+code[c], pattern, 0)

这将使当前值乘以4,并从模式中添加当前元素。把这个写出来会是这样的:

  1. x=0 (初始值) c="A",结果是:4*x+code["A"] = code["A"]
  2. x=code["A"] (以前的结果) c="C",结果是`4*x+code"C“=4*代码”A“+ code"C"
  3. 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"]
  4. 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倍等等。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58094588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档