Заполнить список кортежами

Я просто возлюсь с симуляцией ( Первый закон наследования Менделя).

Прежде чем я смогу дать возможность матерям спариться и проанализировать результат, необходимо сформировать популяцию, т. Е. Список должен быть заполнен различными числами трех разных типов кортежей, не распаковывая их.

Пытаясь ознакомиться с 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')]

Есть ли более разумный, питонный или экономящий память способ составления окончательного списка, например, без создания сначала списков для трех типов лиц?

3 ответа

Решение

Вы могли бы использовать 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)]

Это должно работать, я полагаю.

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')]

или же

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

population = 2*[hd] + 3*[het] + 4*[hr]
Другие вопросы по тегам