如何修复以下代码以枚举字母中长度为$ k $的单词?

时间:2019-03-10 08:13:20

标签: python

在Python 3中,我正在编写代码以列出长度为k的单词列表,其中k是某个给定字母中的正整数。字母应该是一个列表(例如[a,b,c,d])。

代码如下:

def list_len_k_words(alphabet, k):
list = []
if k == 1:
    return alphabet
if k >= 2:
    for i in alphabet:
        for j in list_len_k_words(alphabet,k-1):
            list = list.append(i+j)
    return list

这将引发错误“'NoneType'对象没有属性'append'”。我部分理解发生了什么:如果我打印程序生成的i + j的值,则最后一个值始终为None。这与代码的return语句有关,但是我看不到如何解决它。

1 个答案:

答案 0 :(得分:2)

代码中的主要问题是您将list.append的输出分配给list。 append修改您的列表,但不返回任何内容(实际上,它返回None,因为所有函数都没有明确的返回值)。在下一个循环中,您的列表为None,因此尝试追加到列表失败。

请注意,我将您的列表重命名为'words',因为list是Python内置函数的名称。

def list_len_k_words(alphabet, k):
    words = []
    if k == 1:
        return alphabet
    if k >= 2:
        for i in alphabet:
            for j in list_len_k_words(alphabet,k-1):
                words.append(i+j)
        return words

list_len_k_words('abc', 2)
# ['aa', 'ab', 'ac', 'ba', 'bb', 'bc', 'ca', 'cb', 'cc']

您还可以使用itertools模块来获得相同的结果:

from itertools import permutations

def list_len_k_words(alphabet, k):
    return [''.join(perm) for perm in permutations(alphabet, k)]