【问题标题】:How to generate the permutation of a list in python? [duplicate]如何在python中生成列表的排列? [复制]
【发布时间】:2015-02-16 20:50:02
【问题描述】:

我正在尝试使用递归在 python 中生成列表排列。

import copy

def perm(seq):
    if len(seq) == 1:
        return seq
    else:
        nseq = perm(seq[1:])
        return zip_letter(seq[0], nseq)


def zip_letter(c, seq):
    lis = []
    for i in range(len(seq)+1):
        seq.insert(i, c)
        lis.append(copy.deepcopy(seq))
        seq.pop(i)
    return lis

print perm(['a', 'b', 'c'])

输出是 [['a', ['b', 'c'], ['c', 'b']], [['b', 'c'], 'a', ['c', 'b' ]], [['b', 'c'], ['c', 'b'], 'a']]

看起来不错,但插入格式不正确。 我错过了什么?

【问题讨论】:

标签: python


【解决方案1】:

我建议使用itertools中的现有函数

>>> list(itertools.permutations(['a', 'b', 'c']))
[('a', 'b', 'c'),
 ('a', 'c', 'b'),
 ('b', 'a', 'c'),
 ('b', 'c', 'a'),
 ('c', 'a', 'b'),
 ('c', 'b', 'a')]

【讨论】:

  • 我也喜欢itertools,但这并没有解释如何使用递归生成排列或指出 OP 代码中的错误..
  • 我想使用递归。不是现有的图书馆
  • @manishkumar:在这种情况下,您应该在问题中明确说明您了解itertools.permutations,但您这样做是为了了解递归。但是您的问题可能仍然会被关闭,因为在您的问题中添加的欺骗链接中有很好的递归示例。另请参阅Python recursion permutations
  • @manishkumar:FWIW,最好避免 Python 中的递归,除非你真的需要它。 Python 没有tail call 优化,并且递归深度有限制(尽管可以修改)。因此 Python 中的递归通常效率低下(与提供尾调用优化的语言相比)。您可能还对可以生成 individual permutations given an index number 的迭代代码感兴趣。
  • 感谢您的回答。不过,如果您能告诉我我的代码中缺少什么,那就太好了?
猜你喜欢
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
相关资源
最近更新 更多