【问题标题】:Using recursion for permutations of a list [duplicate]对列表的排列使用递归[重复]
【发布时间】:2019-03-15 16:29:11
【问题描述】:

所以一直在努力解决这个问题,我已经很接近了,终于找到了一种方法,现在在生成的列表中重复了一些期望的输出。

input['a','r','t']

def permutations(string_list):

    if len(string_list) <= 1:
        return [string_list]

    perm_list = []
    for letter_index in range(len(string_list)):
        perms_1 = string_list[letter_index]
        rest = string_list[:letter_index] + string_list[letter_index + 1:]
        for perms_2 in permutations(rest):
            perm_list.append([perms_1] + perms_2)

    return perm_list

输出

[[['a', 'r', 't'], ['a', 't', 'r'], ['r', 'a', 't'], ['r', 't', 'a'],
  ['t', 'a', 'r'], ['t', 'r', 'a']], [['a', 'r', 't'], ['a', 't', 'r'],
  ['r', 'a', 't'],
.........repeats.......repeats..
..for quite sometime but not infinite....]]]

期望的输出

[['a', 'r', 't'], ['a', 't', 'r'], ['r', 'a', 't'], ['r', 't', 'a'],
 ['t', 'a', 'r'], ['t', 'r', 'a']]

所以它是排列,但让我绊倒的是必须使用字符串列表并输出字符串列表列表。如果我只是使用字符串 'art' 作为输入或有一个列表输出 ['art','atr','rat',ect..] 只是没有确定我哪里出错了。不允许导入 itertools 并且真的希望我不需要 for 循环,但使用理解递归调用会给我相同的结果......任何帮助或指针表示赞赏。不只是寻找我想了解的重做......

【问题讨论】:

  • 附言。您的程序对我来说运行正确 - 在生成输入列表的所有排列后它没有重复。
  • 啊,我在将'art'输入递归函数之前调用递归函数将其分隔为['a','r','t']....发现我的错误。 ..

标签: python recursion permutation


【解决方案1】:

使用它,您可以获得所需的输出:

from itertools import permutations

inp = ['a', 'r', 't']

list(permutations(inp, 3))

输出:

[('a', 'r', 't'),
 ('a', 't', 'r'),
 ('r', 'a', 't'),
 ('r', 't', 'a'),
 ('t', 'a', 'r'),
 ('t', 'r', 'a')]

结果是一个元组列表,但您可以根据需要将它们转换为列表。

【讨论】:

    【解决方案2】:
    def permute(input, l, r, arr = []):
        if l == r:
            arr.append(input)
        else:
            for i in range(l, r + 1):
                input[l], input[i] = input[i], input[l]
                permute(input, l + 1, r, arr)
                input[l], input[i] = input[i], input[l]
    
        return arr
    
    input = ['a','r','t']
    n = len(input)
    print (permute(input, 0, n - 1))
    

    结果:

    [['a', 'r', 't'], ['a', 'r', 't'], ['a', 'r', 't'], ['a' , 'r', 't'], ['a', 'r', 't'], ['a', 'r', 't']]

    注意:您缺少 else 声明

    【讨论】:

    • 我怎么会错过那个......几个小时没看到......gragrghghghgghg......谢谢......哇
    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 2011-11-09
    • 2012-09-10
    • 2017-02-21
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多