python - 单词列表中最长的单词链
问题描述
所以,这是我正在尝试制作的功能的一部分。
我不希望代码太复杂。
我有一个单词列表,例如
words = ['giraffe', 'elephant', 'ant', 'tiger', 'racoon', 'cat', 'hedgehog', 'mouse']
单词链序列的想法是下一个单词以最后一个单词结尾的字母开头。
(编辑:每个单词不能多次使用。除此之外没有其他限制。)
我希望输出给出最长的词链序列,在这种情况下是:
['hedgehog', 'giraffe', 'elephant', 'tiger', 'racoon']
我不确定该怎么做,我尝试过不同的尝试。其中之一...
如果我们从列表中的特定单词开始,此代码会正确找到单词链,例如 words[0](所以 'giraffe'):
words = ['giraffe', 'elephant', 'ant', 'tiger', 'racoon', 'cat', 'hedgehog', 'mouse']
word_chain = []
word_chain.append(words[0])
for word in words:
for char in word[0]:
if char == word_chain[-1][-1]:
word_chain.append(word)
print(word_chain)
输出:
['giraffe', 'elephant', 'tiger', 'racoon']
但是,我想找到最长的单词链(如上所述)。
我的方法:所以,我尝试使用我编写并循环的上述工作代码,使用列表中的每个单词作为起点,并为每个单词[0]、单词[1]、单词[2]找到单词链] 等。然后我尝试使用 if 语句找到最长的单词链,并将长度与之前的最长链进行比较,但我无法正确完成,我真的不知道这是怎么回事。
words = ['giraffe', 'elephant', 'ant', 'tiger', 'racoon', 'cat', 'hedgehog', 'mouse']
word_chain = []
max_length = 0
for starting_word_index in range(len(words) - 1):
word_chain.append(words[starting_word_index])
for word in words:
for char in word[0]:
if char == word_chain[-1][-1]:
word_chain.append(word)
# Not sure
if len(word_chain) > max_length:
final_word_chain = word_chain
longest = len(word_chain)
word_chain.clear()
print(final_word_chain)
这是我的第 n 次尝试,我认为这会打印一个空列表,在此之前我进行了不同的尝试,但未能正确清除 word_chain 列表并最终再次重复单词。
非常感谢任何帮助。希望我没有让这变得太乏味或令人困惑......谢谢!
解决方案
当包含正确初始字符的每个可能的字母都添加到运行列表时,您可以使用递归来探索出现的每个“分支”:
words = ['giraffe', 'elephant', 'ant', 'tiger', 'racoon', 'cat', 'hedgehog', 'mouse']
def get_results(_start, _current, _seen):
if all(c in _seen for c in words if c[0] == _start[-1]):
yield _current
else:
for i in words:
if i[0] == _start[-1]:
yield from get_results(i, _current+[i], _seen+[i])
new_d = [list(get_results(i, [i], []))[0] for i in words]
final_d = max([i for i in new_d if len(i) == len(set(i))], key=len)
输出:
['hedgehog', 'giraffe', 'elephant', 'tiger', 'racoon']
此解决方案的工作原理类似于广度优先搜索,get_resuls
因为只要之前未调用过当前值,该函数就会继续遍历整个列表。函数已经看到的值被添加到_seen
列表中,最终停止递归调用流。
此解决方案还将忽略重复的结果:
words = ['giraffe', 'elephant', 'ant', 'ning', 'tiger', 'racoon', 'cat', 'hedgehog', 'mouse',]
new_d = [list(get_results(i, [i], []))[0] for i in words]
final_d = max([i for i in new_d if len(i) == len(set(i))], key=len)
输出:
['ant', 'tiger', 'racoon', 'ning', 'giraffe', 'elephant']
推荐阅读
- azure - 如何设置 app.UseOAuthBearerAuthentication 来处理不同的 Azure B2C 自定义策略?
- e2e-testing - cy.getBy*** 不是函数
- python - plotfly 袖扣不会创建情节
- android - 单击输入元素会将已安装的 Web 应用程序从“独立”更改为“最小 UI”
- performance - 如何索引 cosmosDB 中的缺失值?
- google-apps-script - 如何创建一个在 K 列的第一个空单元格中写入日期的按钮
- excel - 有没有办法在多个 VBA 脚本中使用相同的代码?
- scala - 使用 spark databricks 平台从 URL 读取数据
- javascript - 为什么我的程序会中断?为什么我会收到此错误?
- c# - 如何处理多个值的 DBNull 异常