【问题标题】:Item assignment in a list of lists using a for loop使用 for 循环在列表列表中分配项目
【发布时间】: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


【解决方案1】:

为此已经有一个名为permutations in itertools library 的函数。您可以使用它而不是重新发明轮子。

from itertools import permutations
word = input("Write your word:")

print (["".join(wd) for wd in permutations(word, len(word))])

>>> Write your word:asd
>>> ['asd', 'ads', 'sad', 'sda', 'das', 'dsa']

【讨论】:

    猜你喜欢
    • 2018-06-05
    • 1970-01-01
    • 2011-01-04
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2022-01-06
    相关资源
    最近更新 更多