当前位置: 首页 > 面试题库 >

Python-如何生成一个列表的所有排列?

晏志明
2023-03-14
问题内容

如何在Python中生成一个列表的所有排列,独立于该列表中元素的类型?
例如:

permutations([])
[]

permutations([1])
[1]

permutations([1, 2])
[1, 2]
[2, 1]

permutations([1, 2, 3])
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]

问题答案:

从Python 2.6(如果你使用的是Python 3)开始,你可以使用标准库工具:itertools.permutations。

import itertools
list(itertools.permutations([1, 2, 3]))

如果你出于某种原因使用旧版Python(<2.6),或者只是想知道它的工作原理,那么这是一种不错的方法,取自 http://code.activestate.com/recipes/252178/:

def all_perms(elements):
    if len(elements) <=1:
        yield elements
    else:
        for perm in all_perms(elements[1:]):
            for i in range(len(elements)):
                # nb elements[0:1] works in both string and list contexts
                yield perm[:i] + elements[0:1] + perm[i:]

的文档中列出了几种替代方法itertools.permutations。这是一个:

def permutations(iterable, r=None):
    # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
    # permutations(range(3)) --> 012 021 102 120 201 210
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    if r > n:
        return
    indices = range(n)
    cycles = range(n, n-r, -1)
    yield tuple(pool[i] for i in indices[:r])
    while n:
        for i in reversed(range(r)):
            cycles[i] -= 1
            if cycles[i] == 0:
                indices[i:] = indices[i+1:] + indices[i:i+1]
                cycles[i] = n - i
            else:
                j = cycles[i]
                indices[i], indices[-j] = indices[-j], indices[i]
                yield tuple(pool[i] for i in indices[:r])
                break
        else:
            return

另一个基于itertools.product

def permutations(iterable, r=None):
    pool = tuple(iterable)
    n = len(pool)
    r = n if r is None else r
    for indices in product(range(n), repeat=r):
        if len(set(indices)) == r:
            yield tuple(pool[i] for i in indices)


 类似资料:
  • 问题内容: 假设我们有一个字母“ abcdefghiklimnop”。如何以有效的方式递归地生成排列在FIVE组中的此字母重复的排列? 我几天来一直在为此苦苦挣扎。任何反馈将有所帮助。 本质上,这与以下操作相同:生成给定字符串的所有排列 但是,我只希望整个字符串的长度为5。我还无法弄清楚这一点。 因此,对于“ abcdefghiklimnop”的所有长度为5的所有子串,请查找子串的排列。例如,如果

  • 问题内容: 我正在使用Python 2.7。 我有一个清单,我想要所有可能的有序组合。 这将给出以下输出: 但是我只希望输出是与列表相同顺序的组合。例如删除,,以及因为这些都不是正确的顺序相比列表。 我想通了用这个代替: 给我我想要的输出: 但是Python中是否有任何我想要的内置方法? 问题答案: 我相信您正在寻找的是原始列表中的所有可能 片段 。您所需的输出转换成切片是这样的: 因此,您应该尝

  • 我有五个属性的列表,每个属性有五个不同的值。我想生成它们的笛卡尔乘积,并过滤所有独特的排列。 一些背景: 我需要它们作为我的输入值来解决逻辑难题。在那里我对照他们检查规则以找到正确的解决方案。 也许一个简化的例子就能说清楚。 数据: 数据的笛卡尔乘积: 我想要的是: 我不想要的是: 我不希望同一个值多次出现。位置很重要,因此它应该具有置换性质,对于包含五个元素的列表,它应该具有置换性质。我猜输出大

  • 问题内容: 在Python中,我有一个n个列表的列表,每个列表具有可变数量的元素。如何创建包含所有可能排列的单个列表: 例如 我想要 注意,我事先不知道n。我以为itertools.product是正确的方法,但它需要我提前知道参数的数量 问题答案: 您不需要事先知道使用

  • 问题内容: 这是问题: 给定Python中的项目列表,我将如何获得这些项目的所有可能组合? 这个站点上有几个类似的问题,建议使用itertools.combine,但是仅返回我需要的一部分: 如您所见,它仅按严格顺序返回项目,而不返回(2,1),(3,2),(3,1),(2、1、3),(3、1、2),( 2,3,1)和(3,2,1)。有一些解决方法吗?我似乎什么都没想。 问题答案: 用途: 帮助:

  • 问题内容: 我正在寻找一种生成元素列表的所有可能排列的方法。类似于python的 区别在于我不在乎排列是按需生成(例如python中的生成器)还是全部生成。我也不关心它们是否按字典顺序排序。我所需要做的就是以某种方式获得这些排列。 问题答案: 产生置换的算法很多。我发现的最简单的方法之一是堆算法: 通过选择一对要交换的元素,它会根据前一个生成每个排列。 在上面的链接中概述了这个想法和一个伪代码一个