【发布时间】:2016-03-17 21:32:04
【问题描述】:
打印单词中所有字母的排列方式。
给定一个单词,打印出单词中所有可能的字母重新排列。
word = input("Write your word:")
我的尝试如下:
len(word) 的阶乘提供排列的数量。
count = 1
i = len(word)
while i > 0:
count *= i
i-=1
factorial = count # i!
f_minus = int(count/len(word)) # (i - 1)!
print("There are " + str(count) + " ways to arrange " + str(len(word)) \
+ " letters.")
创建一个列表以附加重新排列的单词。
inside_list = []
for i in range(len(word)):
inside_list.append('')
创建一个列表以包含每个 inside_list。
container_list = []
for i in range(factorial):
container_list.append(inside_list)
变量 f_minus 提供有关每个字母在单词开头出现的次数的详细信息。坚持“农场”,f_minus = (4-1)! = 6。这告诉我们每个字母在第一个位置出现六次。下面的 for 循环打印 'f' 六次,然后打印六个 'a',以此类推。
for index in range(factorial):
print(index + 1, word[index//f_minus])
所以下面的 for 循环将字母分配给每个嵌套列表的第一个元素。
for index in range(factorial):
container_list[index][0] = word[index//f_minus]
print(container_list)
如何将迭代保存到列表列表中,以便 'f's、'a's、'r's 和 'm' 进入嵌套列表的第一个元素,而不是所有 'm's?即前 6 个列表的第一个元素为“f”,接下来的 6 个列表的第一个元素为“a”,依此类推。
【问题讨论】:
-
我怀疑问题在于您的
container_list完全包含对相同inner_list的引用。如果您希望这些值是独立的,则需要创建多个列表。我不确定我是否遵循您的整个代码,所以我不会为您写一个带有具体解决方案的答案。但我建议递归自然适合创建排列,而不是在单个函数中构建巨大的嵌套数据结构。 -
请阅读stackoverflow.com/help/mcve。我怀疑有太多的代码和文本比说明你的简单问题所需的要多。我怀疑比克奈特只需要制作副本是对的。
-
感谢您的回复。递归与迭代很有趣,回顾我的帖子,我同意“代码和文本太多”,我已通读链接并适当注意。如果我调用 container_list [ index ][ 0 ],则引用所有嵌套列表的第一个元素,而不是连续嵌套列表中的第一个元素。如果我手动编写 container_list,则 for 循环可以工作,但是因为每个嵌套列表都被识别为 inside_list,所以我无法引用嵌套列表中的元素。也许有一种方法可以在不手动创建 container_list 的情况下解决这个问题。
-
看你的第一句话,你为什么不直接用itertools.permutations呢?另外,作为参考,你可以做
container_list.append(inside_list[::]) -
@Lafexlos:我无法反驳。我刚刚尝试了 itertools.permutations(),它在我有机会思考发生了什么之前解决了问题。
标签: python-3.x