我无法理解我在这里修改的代码的区别。第一部分来自python documentation.
def product(*args, **kwds):
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)
我想制作一段非常相似的代码,但是我们在实际为参数中的特定元素提取产品时有条件,所以我想将行result = [x+[y] for x in result for y in pool]
转换为多行,然后我可以使用我的if语句等。这就是我所做的,但是当我运行它时,它似乎陷入无限循环,或某事......
def Myproduct(*args, **kwds):
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
for x in result:
for y in pool:
result.append(x+[y])
for prod in result:
yield tuple(prod)
我想真正理解这里的区别。我已经阅读并认为我得到this post,但我仍然没有看到如何在这种情况下正确转换,或者为什么它至少不是相同的转换。提前谢谢。
答案 0 :(得分:4)
问题是您要添加到您要重复的列表中。因此,如果最初是result = [[]]
和pools = [1, 2, 3]
,那么在第一次迭代for x in result
之后,您的列表将是[[], [] + [1]]
,那么您将抓住第二个元素等等。
列表理解是在一行中创建一个新列表,然后将其重命名为映射到结果。
要非常小心修改您要重复的列表!
答案 1 :(得分:2)
这是一个等效函数:
def myproduct(*args, **kwds):
pools = map(tuple, args) * kwds.get('repeat', 1)
result = [[]]
for pool in pools:
nresult = []
for x in result:
for y in pool:
nresult.append(x+[y])
result = nresult
for prod in result:
yield tuple(prod)
请注意,nresult
的创建是为了避免JETM指出的问题。