2013-03-02 47 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'] 
>>>