Pythonic方法:单个列表包含所有子列表的变化

7
我很确定这个简单问题有答案,但我不知道如何用英语表达(感到羞愧),所以决定向人类提问。
假设我有一个列表的列表:
[['Sometimes'], [' '], ['I'], [' '], ['love', 'hate'], [' '], ['pizza', 'coke']]

什么是最符合Python风格的方法来获得以下结果?
['Sometimes I love pizza', 'Sometimes I love coke', 'Sometimes I hate pizza', 'Sometimes I hate coke']
2个回答

12
from itertools import product

options = [['Sometimes'],[' '],['I'],[' '],['love','hate'],[' '],['pizza','coke']]

for combo in product(*options):
    print("".join(combo))
Sometimes I love pizza
Sometimes I love coke
Sometimes I hate pizza
Sometimes I hate coke

非常感谢,这正是我所寻找的!而且,我也学到了它现在被称为什么 :) - c0rdis
1
@Hugh Bothwell 你也应该解释一下 product 方法。 - user4435153

1
这可以用递归生成器很好地实现:
def sentences(lists, i=0, sentence=''):
    if i == len(lists):
        yield sentence
    else:
        for word in lists[i]:
            yield from sentences(lists, i + 1, sentence + word)

然后

lists = [['Sometimes'],[' '],['I'],[' '],['love','hate'],[' '],['pizza','coke']]
for s in sentences(lists):
    print s

打印哪一个

Sometimes I love pizza
Sometimes I love coke
Sometimes I hate pizza
Sometimes I hate coke

要获得实际列表,请使用以下代码:list(sentences(lists))

谢谢你的解决方案!不过,这个解决方案比上面发布的那个更具局限性(也适用于 2.x),而且更加简洁明了 :) - c0rdis
2
@c0rdis,是的。作为学习练习,它有价值,但自从itertools被包含在Python标准库中以来,使用它才是最明智的选择。 - Paul Draper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接