用元组填充列表

2024-10-02 22:29:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我只是在摆弄(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]

这将导致:

^{pr2}$

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


Tags: in列表forhrfirstrepeatitertoolshd
3条回答

我想这应该行得通。在

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上,这样你就可以运行它了。在

population = 2*[('A', 'A')] + 3*[('A', 'a')] + 4*[('a', 'a')]

或者

^{pr2}$

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

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

尽管我想说的是,当你可以简单地做[hd] * k时,没有必要使用itertools.repeat。事实上,我将按照以下方式进行模拟:

^{pr2}$

或者也许

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

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

相关问题 更多 >