繁体   English   中英

为什么Punnet广场会失败?

[英]Why does this Punnet square fail?

这是我的生成方形的程序的一部分。 它应该将形式为[['A','a'],['b','b'],['C',C'] ...]的“基因组”分成可能的配子:

def gene_erator2(gen):
    gam = [[], []]
    q = 0
    for x in gen:
        q = q + 1
        if q > 1:
            gamgam = gam[:]
            for z in gam: 
                gamgam.append(z)
            gam = gamgam[:]
        for y in range(len(gam)):
            if y < len(gam)/2:
                gam[y].append(x[0])
            else:
                gam[y].append(x[1])
    return gam

当我执行

gene_erator2([['A','a'], ['B','b'], ['X','Y']])

我懂了

[['A', 'B', 'b', 'X', 'X', 'Y', 'Y'], ['a', 'B', 'b', 'X', 'X', 'Y', 'Y'], ['A', 'B', 'b', 'X', 'X', 'Y', 'Y'], ['a', 'B', 'b', 'X', 'X', 'Y', 'Y'], ['A', 'B', 'b', 'X', 'X', 'Y', 'Y'], ['a', 'B', 'b', 'X', 'X', 'Y', 'Y'], ['A', 'B', 'b', 'X', 'X', 'Y', 'Y'], ['a', 'B', 'b', 'X', 'X', 'Y', 'Y']]

而不是预期的

[['A', 'B', 'X'], ['a', 'B', 'X'], ['A', 'b', 'X'], ['a', 'b', 'X], ['A', 'B', 'Y'], ['a', 'B', 'Y'], ['A', 'b', 'Y'], ['a', 'b', 'Y']]

....什么? 我的意思是,什么?

编辑:我现在知道的功能,我要感谢尚,但我仍然想知道我的代码出了什么问题...。

标准库中有一个功能可以满足您的需求。

import itertools

def gene_erator2(gen):
    return itertools.product(*gen)

这将返回一个迭代器,使您可以迭代所有组合。

>>> i = gene_erator2([['A','a'],['B','b'],['X','Y']])
>>> list(i)
[('A', 'B', 'X'), ('A', 'B', 'Y'), ('A', 'b', 'X'), ('A', 'b', 'Y'), ('a', 'B', 'X'), ('a', 'B', 'Y'), ('a', 'b', 'X'), ('a', 'b', 'Y')]

除了shang提出的最佳解决方案外,您的代码中还有很多错误。 他们之中有一些是:

一世

     gamgam = gam[:]
    for z in gam: 
        gamgam.append(z)
    gam = gamgam[:]

我相信这是gam列表的两倍,但是在gamgam.append(z)您将另一个引用附加到同一子列表,因此结果将包含许多对初始子列表的引用。

II

upd :这标记为不是错误的,因为在周期内gam大小没有增加

 if y < len(gam)/2:

当您将元素附加到gam时,在这种情况下len(gam)会增加,因此它无法按预期工作。

因此,尽管通过对这两个方法的更正使整个解决方案变得难看,但此代码仍将正常工作:

def gene_erator2(gen):
    gam = [[], []]
    q = 0
    for x in gen:
        q = q + 1
        if q > 1:
            gamgam = gam[:]
            for z in gam:
                gamgam.append(z[:])
            gam = gamgam[:] 
        lenGam = len(gam)
        for y in range(lenGam):
            if y < lenGam/2:
                gam[y].append(x[0])
            else:
                gam[y].append(x[1])
    return gam

UPD:根据要求,这是某种pythonic重新编码itertools.product

def product(collections):
    if collections:
        for subproduct in product(collections[1:]):
            for element in collections[0]:
                yield list(element) + subproduct

    else: yield []

def gene_erator2(gen): return list(product(gen))

另外,在这种情况下,建议使用元组而不是列表。

不使用itertools.product另一种解决问题的方法:

def gene_erator2(args):
    result = [[]]
    for pool in args:
        result = [x+[y] for x in result for y in pool]
    return result

另请itertools.product文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM