python - 用元组填充列表

标签 python bioinformatics rosalind

我只是在摆弄 ( Mendel's First Law of Inheritance) 的模拟。

在我可以让小动物交配和分析结果之前,必须生成种群,即,必须在不拆包的情况下用不同数量的三种不同类型的元组填充列表。

在尝试熟悉 itertools 的同时(我稍后在交配部分需要组合),我想出了以下解决方案:

import itertools

k = 2
m = 3
n = 4

hd = ('A', 'A')       # homozygous dominant
het = ('A', 'a')      # heterozygous 
hr = ('a', 'a')       # homozygous recessive

fhd = itertools.repeat(hd, k)
fhet = itertools.repeat(het, m)
fhr = itertools.repeat(hr, n)

population = [x for x in fhd] + [x for x in fhet] + [x for x in fhr]

这会导致:

[('A', 'A'), ('A', 'A'), ('A', 'a'), ('A', 'a'), ('A', 'a'), ('A', 'a'), ('A', 'a'), ('A', 'a'), ('A', 'a')]

是否有更合理的、pythonic 或节省内存的方式来构建最终列表,例如不先生成三类人的列表?

最佳答案

您可以使用 itertools.chain 来组合迭代器:

population = list(itertools.chain(fhd, fhet, fhr))

虽然我会说没有必要使用 itertools.repeat,但您可以简单地执行 [hd] * k。事实上,我会按如下方式处理此模拟:

pops = (20, 30, 44)
alleles = (('A', 'A'), ('A', 'a'), ('a', 'a'))

population = [a for n, a in zip(pops, alleles) for _ in range(n)]

或许

allele_freqs = ((20, ('A', 'A')),
                (30, ('A', 'a')),
                (44, ('a', 'a')))

population = [a for n, a in allele_freqs for _ in range(n)]

关于python - 用元组填充列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17114541/

相关文章:

python - GetProcAddress 返回值

python - 这是 scipy.interpolate.interp1d 中的错误吗?

Python Flask 应用程序抛出 RuntimeError : working outside of request context

python - 字符串长度不等的多序列比对

R - 热图 - 列宽(布局?)

arrays - 在 perl 中对数组使用编辑距离

performance - 在 DNA 中寻找基序

python - 如何使用 asyncio 在单独的线程上通知 RxPY 观察者?

python - 无法将 Python 代码发布到网站 rosalind.info