可以说我有一个值列表

my_list = [1,2,3,4]


我使用itertools.permutations查找此列表的所有组合

perms = itertools.permutations(my_list)


哪个创造

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


我开始对此进行迭代,发现我不再需要perms中以(4,1...(3,1...开头的任何项目。

如何针对那些特定的遗漏重新创建此列表?遍历和删除项目是不可行的,因为这需要扩展到非常大的尺寸。

编辑:为澄清起见,应删除(4,1,2,3),因为它以(4,1...)开头,而不是(4,2,1,3),因为它以(4,2...)开头。

最佳答案

因为你说


  遍历和删除项目是不可行的,因为这需要
  缩放到非常大的尺寸。


最好是包装由permutations生成的插入器,该插入器将生成所需的元组,并跳过不需要的元组:

my_list = [1,2,3,4]

def my_perms(my_list, f):
    for e in permutations(my_list):
        if f(e):
            yield e

>>> list(my_perms(my_list, lambda t: t[:2] not in {(4,1), (3,1)}))
[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2), (2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)]


或者,使用ifilter from itertools

>>> list(ifilter(lambda t: t[:2] not in {(4,1), (3,1)}, permutations(my_list)))


或者,直接在Python 3+上进行过滤,因为与在Python 2上进行过滤相比,这还会创建一个迭代器而不是创建一个列表。

关于python - Python-有遗漏的排列新 list ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30401273/

10-11 00:49
查看更多