2013-06-14 35 views
7

Tôi chỉ đang sử dụng mô phỏng (Mendel's First Law of Inheritance).Danh sách phổ biến với bộ dữ liệu

Trước khi tôi có thể cho các sinh vật giao phối và phân tích kết quả, dân số phải được tạo, tức là danh sách phải được điền với số lượng khác nhau của ba loại bộ khác nhau mà không giải nén chúng.

Trong khi cố gắng để làm quen với itertools (Tôi sẽ cần phải kết hợp sau đó trong phần giao phối), tôi đã đưa ra các giải pháp sau đây:

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] 

mà sẽ cho kết quả:

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

Có cách nào tiết kiệm hơn, hợp lý hoặc tiết kiệm bộ nhớ để xây dựng danh sách cuối cùng, ví dụ mà không tạo danh sách cho ba loại cá nhân trước?

+0

gì chính xác là đầu ra bạn đang hy vọng gì? – cdhagmann

+0

@cdhagmann Câu hỏi được chỉnh sửa, đầu ra dự kiến ​​giờ đã bao gồm –

Trả lời

6

Bạn có thể sử dụng itertools.chain để kết hợp các vòng lặp:

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

Mặc dù tôi có thể nói không có nhu cầu sử dụng itertools.repeat khi bạn chỉ có thể làm [hd] * k. Thật vậy, tôi sẽ tiếp cận mô phỏng này như sau:

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

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

hoặc có lẽ

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

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

Cá nhân, tôi cảm thấy rằng phạm vi sử dụng không phải là rất nhiệt đới, nhưng đó là một vấn đề khá nhỏ –

+0

@SlaterTyranus: Làm thế nào là 'phạm vi' không Pythonic? –

+0

như tôi đã nói, đó là một điều nhỏ, nhưng nhìn thấy phạm vi luôn luôn nhắc nhở tôi về Java và ít chức năng hơn, nhưng nó thực sự là một điều cá nhân. –

1

này nên làm việc Tôi cho rằng.

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] 

Tôi đã đặt mã trên CodeBunk để bạn cũng có thể chạy mã.

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

hoặc

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

population = 2*[hd] + 3*[het] + 4*[hr] 
Các vấn đề liên quan