【发布时间】:2013-03-01 02:54:09
【问题描述】:
我希望能够生成有条件的产品。与此答案非常相似: All combinations of a list of lists
我想使用itertools.product(*listOfLists)。但是,我的问题是从一个列表中包含一个元素意味着必须咨询其他列表以获取该产品。
例子:
colors = ['red', 'blue', 'green']
fruits = ['apple', 'orange', 'banana']
locations = ['indoors', 'outdoors']
indoor_choices = ['bathroom', 'bedroom', 'kitchen']
green_choices = ['forest', 'light', 'dark']
在这里,我们希望始终考虑颜色、服装和位置的所有可能选择。然而,在'indoor'的情况下,我们也想考虑indoor_choices,而在'green'是可能的选择的情况下,我们也想选择更具体的绿色。这是一种可能性树,其中一些分支继续分支,而其他分支则没有。
所以在上面这个愚蠢的例子中,你可以像这样做一个 for 循环:
for c in colors:
for f in fruits:
for l in locations:
# etc
但是我们会遇到一个问题,即当两个不同的类别基于此选择可能出现分支时会发生什么。
一个简单(hacky)的解决方案就是手动编写条件代码并在其中放入 for 循环:
for c in colors:
for f in fruits:
for l in locations:
if c == 'green' and l == 'indoor':
for gc in green_choices:
for ic in indoor_choices:
# output
elif c == 'green':
for gc in green_choices:
# output
elif l == 'indoor':
for gc in green_choices:
# output
else:
# output
但是想象一下当有 N 个列表中的 M 个有额外分支时的恐怖。或者更糟糕的是,还有 nested 额外的分支......基本上这种 hack 无法扩展。
有什么想法吗?事实证明,这个问题本身就很困难!
【问题讨论】:
-
首先,您应该使您的代码可重现(
colors = ["red", "blue", "green"]而不是colors = [red, blue, green])。此外,听起来您为这个问题使用了错误的数据结构。indoors与indoor_choices是如何关联的?它不应该是一个嵌套列表吗? -
完成。不,不是嵌套列表。仍然重要的是要知道,在特定的
选择中,我们选择了“green”和“indoors”,这迫使我们为特定类型的室内做出额外的选择组合和特定类型的绿色。您是否理解我所说的问题?也许我不是最清楚的...... -
如果不是嵌套列表,则至少
indoor_choices和green_choices应该在字典中,由字符串indoor和green索引。这将使您不必遇到使用不同变量的特殊情况。 -
不确定您的建议是什么?我想重申这是一个愚蠢的例子,这个概念是我有一个 N 个列表。在这些 N 中,它们的子集总是从 A =(颜色、水果、位置)中选择。另一个不相交的子集是有条件的,只有在包含 A 的特定元素时才会考虑这些选择。我意识到字典可能是可视化代码的更好方法,但我唯一的目标是枚举这些条件组合。或者您对 dicts 如何启用此类枚举有什么建议?
标签: python tree combinatorics itertools