使用元组填充列表

Kla*_*cha 7 python bioinformatics rosalind

我只是在模仿(孟德尔的第一遗传定律).

在我可以让生物交配并分析结果之前,必须生成群体,即,必须在不解包它们的情况下用不同数量的三种不同类型的元组填充列表.

在尝试熟悉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]
Run Code Online (Sandbox Code Playgroud)

这将导致:

[('A', 'A'), ('A', 'A'), ('A', 'a'), ('A', 'a'), ('A', 'a'), ('A', 'a'), ('A', 'a'), ('A', 'a'), ('A', 'a')]
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*son 6

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

population = list(itertools.chain(fhd, fhet, fhr))
Run Code Online (Sandbox Code Playgroud)

虽然我会说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)]
Run Code Online (Sandbox Code Playgroud)

也许

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

population = [a for n, a in allele_freqs for _ in range(n)]
Run Code Online (Sandbox Code Playgroud)