Python 列表中的递归问题

Python 列表中的递归问题,python,Python,编写一个函数词_permutations _dict(),以字符串作为输入,并返回一个字典,其中键是输入字符串中的每个单词,值是包含该单词每个字母排列的字符串的列表。 我必须在这里使用递归。这是我的代码,我试图将我的列表放入一个集合中,但得到了一个不可破坏的列表错误。如有任何意见,将不胜感激 test_string = 'moths are insect teddy bears' def word_permutations_dict(input_string): s2 = input

编写一个函数词_permutations _dict(),以字符串作为输入,并返回一个字典,其中键是输入字符串中的每个单词,值是包含该单词每个字母排列的字符串的列表。
我必须在这里使用递归。这是我的代码,我试图将我的列表放入一个集合中,但得到了一个不可破坏的列表错误。如有任何意见,将不胜感激

test_string = 'moths are insect teddy bears'


def word_permutations_dict(input_string):
    s2 = input_string.split(' ')
    d = {}
    v = set()
    for w in s2:
        listtemp = list(w)
        v = perms(len(listtemp), listtemp)
        d[w] = v
    return d


def perms(start, list1):
    if start == 1:
        list1.append(list1)
    else:
        for i in range(start - 1):
            perms(start - 1, list1)
            if i % 2 == 1:
                list1[0], list1[start - 1] = list1[start - 1], list1[0]
            else:
                list1[i], list1[start - 1] = list1[start - 1], list1[i]
        perms(start - 1, list1)

    return list1


perms_dict = word_permutations_dict(test_string)

for k, v in perms_dict.items():
    print('{} : {} permutations'.format(k, len(v)))
输出:

moths : 125 permutations
are : 9 permutations
insect : 726 permutations
teddy : 125 permutations
bears : 125 permutations 
预期:

moths : 120 permutations
are : 6 permutations
insect : 720 permutations
teddy : 60 permutations
bears : 120 permutations
用python已经提供的一个实现删除perms


用python已经提供的一种方法删除perms的实现。

一些重复字母的单词是一个多集。答案可能是:

from collections import Counter
import math

test_string = 'moths are insect teddy bears'

for word in test_string.split():
    v = Counter(word).values()
    result = math.factorial(len(word))
    for count in v:
        result /= math.factorial(count)
    print(word, ':', result)
输出:

moths : 120.0
are : 6.0
insect : 720.0
teddy : 60.0
bears : 120.0

有些字母重复的单词是多重集合。答案可能是:

from collections import Counter
import math

test_string = 'moths are insect teddy bears'

for word in test_string.split():
    v = Counter(word).values()
    result = math.factorial(len(word))
    for count in v:
        result /= math.factorial(count)
    print(word, ':', result)
输出:

moths : 120.0
are : 6.0
insect : 720.0
teddy : 60.0
bears : 120.0

首先,应该更好地命名变量。为了代码读者和你自己。如果使用单个字母和所有小写名称而不使用下划线,则会让人非常困惑

您计算的排列是错误的,这就是输出不正确的原因

不要初始化
v=set()
,因为它总是被您的

v=perms()函数调用

仅举一个例子:

def排列(输入字符串):
perms=[]
如果len(输入字符串)==1:
#如果有一个字符,则返回它
perms=[输入字符串]
对于idx,枚举中的字母(输入字符串):
对于置换中的置换(输入字符串[:idx]+输入字符串[idx+1:]):
烫发+=[字母+烫发]
回烫
打印(len(permute(“moths”))

首先,您应该更好地命名变量。为了代码读者和你自己。如果使用单个字母和所有小写名称而不使用下划线,则会让人非常困惑

您计算的排列是错误的,这就是输出不正确的原因

不要初始化
v=set()
,因为它总是被您的

v=perms()函数调用

仅举一个例子:

def排列(输入字符串):
perms=[]
如果len(输入字符串)==1:
#如果有一个字符,则返回它
perms=[输入字符串]
对于idx,枚举中的字母(输入字符串):
对于置换中的置换(输入字符串[:idx]+输入字符串[idx+1:]):
烫发+=[字母+烫发]
回烫
打印(len(permute(“moths”))

请格式化代码:选择它并键入
ctrl-k
。。。当发布有关产生异常的代码的问题时,请始终包含完整的回溯-复制并粘贴它,然后将其格式化为代码(选择它并键入
ctrl-k
),请编辑问题以具体解释您试图解决的问题,并解释您的预期输出。另外,为什么这个问题同时被标记为
python-3.x
python-2.7
?如果您的代码抛出错误,您将如何获得输出?很抱歉,新出现的
获取不可修复的列表错误
-无法复制。请格式化代码:选择它并键入
ctrl-k
。。。当发布有关产生异常的代码的问题时,请始终包含完整的回溯-复制并粘贴它,然后将其格式化为代码(选择它并键入
ctrl-k
),请编辑问题以具体解释您试图解决的问题,并解释您的预期输出。另外,为什么这个问题同时被标记为
python-3.x
python-2.7
?如果您的代码抛出错误,您如何获得输出?很抱歉,新出现的
获取不可修复的列表错误
-无法再现。感谢您的帮助,我应该从一开始就使用enumerate:)如果字符串中有重复的字符,那么我们将在不同的排列下获得相同的字符串。如果我们不删除它们,它将错误计算总计数。感谢您从一开始就应该使用enumerate的帮助:)如果字符串中有重复的字符,那么我们将在不同的排列下得到相同的字符串。如果我们不删除它们,它将错误计算总计数。这是最好的解决方案,因为它是O(n)。如果你只想计算O(n!)置换,就不需要生成所有的O(n!)置换。这是最好的解决方案,因为它是O(n)。如果您只想计算O(n!)置换,则无需生成所有O(n!)置换。