给出一系列列表,例如:
[['a', 'b'], ['c', 'd'], ['e']]
结果应该是:
['ace', 'ade', 'bce', 'bde']
嵌套列表的长度不同。必须保持订单 - 即首字母必须来自第一个清单,第二个字母必须来自第二个清单等。
这是我当前的递归解决方案:
def combine_letters(l)
if len(l) == 0:
return l[0]
temp = [x + y for x in l[0] for y in l[1]]
new = [temp] + l[2:]
return combine_letters(new)
然而,我觉得应该有一个快速,甚至一行的方式来做到这一点,可能使用reduce函数。有什么想法吗?
谢谢!
编辑:这与链接的问题并不完全相似。首先,它适用于任意数量的子列表。其次,它返回字符串而不是元组。
答案 0 :(得分:4)
>>> L = [['a', 'b'], ['c', 'd'], ['e']]
>>> import itertools
>>> list(itertools.product(*L))
[('a', 'c', 'e'), ('a', 'd', 'e'), ('b', 'c', 'e'), ('b', 'd', 'e')]
>>> list(''.join(tup) for tup in list(itertools.product(*L)))
['ace', 'ade', 'bce', 'bde']