2013-06-14 16 views
7

Po prostu bawię się symulacją (Mendel's First Law of Inheritance).Lista zapełnień z krotkami

Zanim mogę pozwolić współmieszkom zwierząt i przeanalizować wynik, należy wygenerować populację, tj. Lista musi być wypełniona zmienną liczbą trzech różnych typów krotek bez rozpakowywania ich.

Starając się zapoznać z itertools (Muszę kombinacje później w części współpracującej), wymyśliłem następujące rozwiązanie:

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] 

co skutkowałoby:

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

Czy istnieje rozsądniejszy, pytonowy lub oszczędzający pamięć sposób na zbudowanie ostatecznej listy, np. bez generowania najpierw list dla trzech typów osób?

+0

Czym dokładnie jest wyjście masz nadzieję? – cdhagmann

+0

@cdhagmann Edytowane pytanie, oczekiwany wynik jest teraz dołączony –

Odpowiedz

6

Można użyć itertools.chain połączyć iteratorów:

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

Chociaż powiedziałbym, że nie ma potrzeby korzystania itertools.repeat kiedy można po prostu zrobić [hd] * k. Rzeczywiście, chciałbym podejść do tej symulacji następująco:

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

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

czy może

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

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

Osobiście uważam, że używanie zakresu nie jest bardzo pytoniczne, ale jest to dość niewielki problem w stylu: –

+0

@SlaterTyranus: Czym jest "zasięg", a nie Pythonic? –

+0

Tak jak powiedziałem, jest to mała rzecz, ale widzący zasięg zawsze przypomina mi Javę i jest mniej funkcjonalny, ale to naprawdę osobista sprawa. –

1

to powinno działać jak sądzę.

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] 

Umieściłem kod na CodeBunk, aby można było go uruchomić.

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

lub

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

population = 2*[hd] + 3*[het] + 4*[hr]