7

我只是在摆弄(孟德尔第一定律)的模拟。

在我可以让小动物交配并分析结果之前,必须生成种群,即,必须在列表中填充不同数量的三种不同类型的元组,而无需解包它们。

在尝试熟悉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 或节省内存的方式来构建最终列表,例如不首先为三种类型的个人生成列表?

4

3 回答 3

6

您可以使用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)]
于 2013-06-14T17:58:30.330 回答
1

我想这应该可行。

pops = [2,3,4]
alleles = [('A','A'), ('A', 'a'), ('a','a')]
out = [pop*[allele] for pop, allele in zip(pops,alleles)]
print [item for sublist in out for item in sublist]

我已将代码放在CodeBunk上,因此您也可以运行它。

于 2013-06-14T18:22:22.547 回答
0
population = 2*[('A', 'A')] + 3*[('A', 'a')] + 4*[('a', 'a')]

或者

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

population = 2*[hd] + 3*[het] + 4*[hr]
于 2013-06-14T18:41:40.517 回答