Python - 递归单词列表

时间:2016-11-25 06:25:52

标签: python

我试图制作一个 anagram算法,但是一旦我进入递归部分,我就陷入了困境。如果需要更多信息,请告诉我。

我的代码:

def ana_words(words, letter_count):
    """Return all the anagrams using the given letters and allowed words.

    - letter_count has 26 keys (one per lowercase letter),
      and each value is a non-negative integer.

    @type words: list[str]
    @type letter_count: dict[str, int]
    @rtype: list[str]
    """
    anagrams_list = []
    if not letter_count:
        return [""]

    for word in words:
        if not _within_letter_count(word, letter_count):
            continue

        new_letter_count = dict(letter_count)

        for char in word:
            new_letter_count[char] -= 1

        # recursive function
        var1 = ana_words(words[1:], new_letter_count)

        sorted_word = ''.join(word)

        for i in var1:
            sorted_word = ''.join([word, i])

        anagrams_list.append(sorted_word)

    return anagrams_list

单词是文件中的单词列表,字母计数是字符字典(已经是小写)。单词中的单词列表也已经是小写的。

输入:打印ana_words('宿舍')

输出我得到:

['dirtyroom', 'dotoi', 'doori', 'dormitory', 'drytoori', 'itorod', 'ortoidry', 'rodtoi', 'roomidry', 'rootidry', 'torodi']

我想要的输出

['dirty room', 'dormitory', 'room dirty']

链接到单词列表:https://1drv.ms/t/s!AlfWKzBlwHQKbPj9P_pyKdmPwpg

2 个答案:

答案 0 :(得分:0)

在不知道你的单词列表的情况下,很难说出为什么会包含“错误”字样。条目。尝试使用

words = ['room','dirty','dormitory']

返回正确的条目。

如果您想要更改单词之间的空格

sorted_word = ''.join([word, i])

sorted_word = ' '.join([word, i])

(注意增加的空间)

顺便提一下,如果您想要更有效地解决这个问题,那么使用' trie'存储单词的数据结构可以提供帮助(https://en.wikipedia.org/wiki/Trie

答案 1 :(得分:0)

问题错误:

你在说:

  

单词是文件中的单词列表,字母计数是字符字典(已小写)。单词中的单词列表也是小写的。

但实际上你是以不同的方式调用函数:

  

print ana_words('dormitory')

这不对。

检查词典值是否全部为0:

if not letter_count:没有达到您的预期。要检查字典是否全部为0,您应该首先获取值if not any(letter_count.values()):,检查它们是否与0不同,然后否定答案。

加入词语

str.join(arg1)方法不是用于连接2个单词,用于加入由字符串作为arg1传递的迭代,在您的情况下,字符串是可迭代的字符,并且您没有任何连接,因此结果是相同的字。

''.join('Hello')
>>> 'Hello'

第二次使用它时,iterable是列表,它与var1的每个元素连接,这实际上是一个单词列表,所以很好地排除了你在这里缺少的空间。问题是你没有对sorted_words做任何事情。您刚刚使用它上次出现的时间。 anagram_list.append(sorted_word)应位于循环内,sorted_word = ''.join(word)应删除。

其他错误:

除了所有这些错误之外,你永远不会检查字母数是否达到0来停止递归。