python - 用 n 个字母列出所有可能的单词
问题描述
我想列出所有可能包含 n 个字母的单词,其中第一个字母可以是 a1 或 a2,第二个可以是 b1、b2 或 b3,第三个可以是 c1 或 c2,... 这是 n 的简单示例输入输出=2,每个字母有 2 个备选方案:
- 输入 = [["a","b"],["c","d"]]
- 输出 = [“ac”、“ad”、“bc”、“bd”]
我尝试通过首先使用前 2 个字母创建所有可能的单词来递归地执行此操作,所以是这样的:
def go(l):
if len(l) > 2:
head = go(l[0:2])
tail = l[2:]
tail.insert(0, head)
go(tail)
elif len(l) == 2:
res = []
for i in l[0]:
for j in l[1]:
res.append(i+j)
return res
elif len(l) == 1:
return l
else:
return None
但是,对于较大的 n 或每个字母的许多替代方案,这变得非常慢。解决这个问题的更有效方法是什么?
谢谢
解决方案
我想你只想itertools.product
在这里:
>>> from itertools import product
>>> lst = ['ab', 'c', 'de']
>>> words = product(*lst)
>>> list(words)
[('a', 'c', 'd'), ('a', 'c', 'e'), ('b', 'c', 'd'), ('b', 'c', 'e')]`
或者,如果您希望它们组合成单词:
>>> [''.join(word) for word in product(*lst)]
['acd', 'ace', 'bcd', 'bce']
或者,以您的示例为例:
>>> lst = [["a","b"],["c","d"]]
>>> [''.join(word) for word in product(*lst)]
['ac', 'ad', 'bc', 'bd']
当然对于非常大n
或非常大的字母集(大小m
),这会很慢。如果你想生成一个指数级大的输出集(O(m**n)
),那将需要指数级的时间。但至少它具有恒定而不是指数空间(它一次生成一个产品,而不是所有这些产品的巨大列表),并且会比你在路上的速度快一个像样的常数因子,而且它是更简单,更难出错。
推荐阅读
- firebase - 有没有办法删除 Firebase 云消息传递 (FCM) 主题?
- sql - 将多个查询与 4 个连接结合起来?
- javascript - 如何使用 puppeteer 获取鼠标位置
- javascript - characters.map 不是函数
- javascript - 如何在点击时显示 0:00 而不是 NaN:NaN
- ios - 如何在 Swift 中屏蔽 UIStackView?
- swift - UIStackView() 不显示
- java - 如何单个函数调用多个活动?
- android - 为什么我的编辑文本启用时没有出现闪烁的光标?
- c++ - Codeforces 中的左撇子、右撇子和 Ambidexters 问题给了我一个错误