[英]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)
您将另一个引用附加到同一子列表,因此结果将包含许多对初始子列表的引用。
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.