tuples

2013-06-14 22 views
7

के साथ पॉप्युलेट सूची मैं केवल (Mendel's First Law of Inheritance) के सिमुलेशन के साथ झुका रहा हूं।tuples

इससे पहले कि मैं क्रिटर्स को दोस्त बना सकूं और परिणाम का विश्लेषण कर सकूं, जनसंख्या उत्पन्न होनी चाहिए, यानी, एक सूची को बिना किसी अनपॅक किए तीन अलग-अलग प्रकार के टुपल्स की अलग-अलग संख्याओं से भरना होगा।

परिचित कराने के लिए साथ 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')] 

अंतिम सूची बनाने के लिए एक और अधिक उचित, पायथनिक या स्मृति बचत तरीका है, उदाहरण के लिए पहले तीन प्रकार के व्यक्तियों की सूची तैयार किए बिना?

+0

वास्तव में क्या है उत्पादन के लिए उम्मीद कर रहे हैं? – cdhagmann

+0

@cdhagmann संपादित प्रश्न, अपेक्षित आउटपुट अब –

उत्तर

6

आप iterators गठबंधन करने के लिए 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)] 
+0

व्यक्तिगत रूप से शामिल है, मुझे लगता है कि रेंज का उपयोग करना बहुत ही पाइथोनिक नहीं है, लेकिन यह एक बहुत ही मामूली स्टाइल इश्यू है –

+0

@ स्लेटररियरस: 'रेंज' पायथनिक नहीं है? –

+0

जैसा कि मैंने कहा, यह एक छोटी सी चीज है, लेकिन रेंज देखना हमेशा मुझे जावा की याद दिलाता है और कम कार्यात्मक है, लेकिन यह वास्तव में एक निजी चीज़ है। –

1

यह काम करना चाहिए मुझे लगता है।

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 पर रखा है ताकि आप इसे भी चला सकें।

0
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]