当前位置:  开发笔记 > 编程语言 > 正文

如何在Python中获取列表的所有排序排列

如何解决《如何在Python中获取列表的所有排序排列》经验,为你挑选了1个好方法。

给定一个列表,我想要一定长度的所有排列,但只有那些保持排序的排列.

所以,如果列表是

[1,1,3,4]

然后长度为2的答案是

 [[1,1], [1,1], [1,3], [1,3] [3,4], [1,4], [1,4]]

请提供有效的答案.



1> Inbar Rose..:
import itertools

l = [1, 1, 3, 4]
r = [perm for perm in itertools.permutations(l, 2) if sorted(perm) == list(perm)]

结果是:

[(1, 1), (1, 3), (1, 4), (1, 1), (1, 3), (1, 4), (3, 4)]

如果您希望结果排序,并且唯一:

s = sorted(set(r))  #  [(1, 1), (1, 3), (1, 4), (3, 4)]

如果您希望将结果作为列表而不是元组,只需将它们转换为 list()


使用itertools.permutations我的配方为您做了这个便利功能:

def sorted_perms(iterable, r=None):
    pool = tuple(sorted(iterable))
    n = len(pool)
    r = n if r is None else r
    for indices in itertools.product(range(n), repeat=r):
        if len(set(indices)) == r and tuple_is_sorted(indices):
            yield tuple(pool[i] for i in indices)

memo = {}  # simple memoization for efficiency.
def tuple_is_sorted(t):
    return memo.setdefault(t, bool(sorted(t) == list(t)))

r = list(sorted_perms(l, 2))  #  [(1, 1), (1, 3), (1, 4), (1, 3), (1, 4), (3, 4)]
s = sorted(set(r))  #  [(1, 1), (1, 3), (1, 4), (3, 4)]

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有