2013-06-14 4 views
7

Je suis juste en train de jouer avec une simulation de (Mendel's First Law of Inheritance). Avant que je puisse laisser les créatures s'accoupler et analyser le résultat, la population doit être générée, c'est-à-dire qu'une liste doit être remplie avec un nombre variable de trois types différents de tuples sans les déballer.Remplir la liste avec des tuples

Tout en essayant de se familiariser avec itertools (je aurai besoin des combinaisons plus tard dans la partie d'accouplement), je suis venu avec la solution suivante:

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] 

qui se traduirait par:

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

Existe-t-il un moyen plus raisonnable, pythonique ou permettant de gagner de la mémoire pour construire la liste finale, par ex. sans générer les listes de pour les trois types d'individus en premier?

+0

Quelle est la sortie que vous espérez exactement? – cdhagmann

+0

@cdhagmann Edited question, la sortie attendue est maintenant incluse –

Répondre

6

Vous pouvez utiliser itertools.chain pour combiner les itérateurs:

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

Bien que je dirais qu'il n'y a pas besoin d'utiliser itertools.repeat quand vous pouvez simplement faire [hd] * k. En effet, j'aborder cette simulation comme suit:

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

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

ou peut-être

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

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

Personnellement, je pense que l'utilisation de la gamme n'est pas très pythonien, mais c'est un problème de style mineur mineur –

+0

@SlaterTyranus: Comment 'range' pas Pythonic? –

+0

Comme je l'ai dit, c'est une petite chose, mais voir la gamme me rappelle toujours Java et est moins fonctionnel, mais c'est vraiment une chose personnelle. –

1

Cela devrait fonctionner, je suppose.

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] 

J'ai mis le code sur CodeBunk pour que vous puissiez l'exécuter aussi.

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

ou

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

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