2013-03-02 20 views
1

我想找到特定十字的所有可能的配子。Punnett Square功能:列表中的匹配項目

例如:'AABB' x 'aabb'將被拆分爲['AA', 'BB']['aa', 'bb']。我完成了那部分。在此之後,它應該返回: [['Aa', 'Aa', 'Aa', 'Aa'], ['Bb', 'Bb', 'Bb', 'Bb']](對於父'A'中的每個等位基因,它與父'B'中的等位基因匹配;這是簡化的Punnett Square)。

這是我到目前爲止有:

def punnett(a, b): 
    n = int(len(a)/2) 
    x = int(float(len(a))/n) 
    partsA, partsB, gametes = [a[i * x : i * x + x] for i in range(n)], [b[i * x : i * x + x] for i in range(n)], [] 
    for y in range(1, n): 
     g = [] 
     for index in range(0, n/2 + y): 
      for i in partsA[index]: 
       for j in partsB[index]: 
        g.append(i+j) 
     gametes.append(g) 
    return gametes 

它不會導致我估計它會,但:

>>> punnett('AaBb', 'AaBb') 
[['AA', 'Aa', 'aA', 'aa', 'BB', 'Bb', 'bB', 'bb']] 

此外,trihybrid交不給結果我預料,要麼:

>>> punnett('AaBbCc', 'AaBbCc') 
[['AA', 'Aa', 'aA', 'aa', 'BB', 'Bb', 'bB', 'bb'], ['AA', 'Aa', 'aA', 'aa', 'BB', 'Bb', 'bB', 'bb', 'CC', 'Cc', 'cC', 'cc']] 

如果我能得到什麼我做錯了什麼,我怎麼能改善它的輸入,那窩很棒。謝謝!

+0

@JBernardo請問您可以在此擴展嗎?我對這些功能不是很熟悉(我以前只使用'itertools.permutations')。 – 2013-03-02 04:16:12

回答

2

OK,我剛剛看了你可能想達到什麼樣的,這裏的一些材料是改變

>>> from itertools import product, izip 

如果我理解正確的,一個等位基因是連續字符忽略大小寫。在「AABB」其[「AA」和「B-B」]的情況下

>>> def allele(e): 
    return [list(v) for _, v in groupby(e, key = str.lower)] 

跨被定義爲材料和母體

之間的等位基因的所有可能的交叉其次的選擇來自交叉的新基因組

>>> def punnett(a, b): 
    return [''.join(e) 
     for e in product(*([''.join(e) for e in product(*e)] 
        for e in izip(allele(a), allele(b))))] 

>>> punnett('AaBbCc', 'AaBbCc') 
['AABBCC', 'AABBCc', 'AABBcC', 'AABBcc', 'AABbCC', 'AABbCc', 'AABbcC', 'AABbcc', 'AAbBCC', 'AAbBCc', 'AAbBcC', 'AAbBcc', 'AAbbCC', 'AAbbCc', 'AAbbcC', 'AAbbcc', 'AaBBCC', 'AaBBCc', 'AaBBcC', 'AaBBcc', 'AaBbCC', 'AaBbCc', 'AaBbcC', 'AaBbcc', 'AabBCC', 'AabBCc', 'AabBcC', 'AabBcc', 'AabbCC', 'AabbCc', 'AabbcC', 'Aabbcc', 'aABBCC', 'aABBCc', 'aABBcC', 'aABBcc', 'aABbCC', 'aABbCc', 'aABbcC', 'aABbcc', 'aAbBCC', 'aAbBCc', 'aAbBcC', 'aAbBcc', 'aAbbCC', 'aAbbCc', 'aAbbcC', 'aAbbcc', 'aaBBCC', 'aaBBCc', 'aaBBcC', 'aaBBcc', 'aaBbCC', 'aaBbCc', 'aaBbcC', 'aaBbcc', 'aabBCC', 'aabBCc', 'aabBcC', 'aabBcc', 'aabbCC', 'aabbCc', 'aabbcC', 'aabbcc'] 
>>> punnett('AaBb', 'AaBb') 
['AABB', 'AABb', 'AAbB', 'AAbb', 'AaBB', 'AaBb', 'AabB', 'Aabb', 'aABB', 'aABb', 'aAbB', 'aAbb', 'aaBB', 'aaBb', 'aabB', 'aabb'] 
>>> 
相關問題