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