使用Python创建布尔列表的组合/排列,而不使用ITERTOOLS

5
l = [True, True , False]

不使用itertools模块。

如何在一个新的list中创建l的排列。

newlist = [[True,True,False],[True,True,True], [False,False,True],[False,False,False]....]

基本上我想做的是:
allorderings = itertools.product ([False, True], repeat = n)

https://dev59.com/OHVD5IYBdhLWcg3wDXJ3 - seb
[True, True, True], [False, False, True] 和 [False, False, False] 不是 [True, True, False] 的排列组合。 - miles82
哦,对了。那不叫排列。你怎么称呼不同的组合? - user3349106
所以你想要一个产品,但是你的输入列表没有被正确指定。在这里查看实现:https://docs.python.org/2/library/itertools.html#itertools.product - miles82
4个回答

4

使用itertools.permutations

import itertools
l = [True, True , False]
newlist = list(itertools.permutations(l))

编辑:根据你的问题,你需要的排列之一是(True, True, True),但它并不是列表l的任何一个排列。这个答案在技术上给出了列表的排列,你可能需要额外的工作才能实现你在问题中展示的内容(除非当然那是一个笔误)。


2
我能想到的最简单的方法是三次迭代相同的项目列表,并仅收集唯一的项目,如下所示。
l = set([True, True, False])
print {(i, j, k) for i in l for j in l for k in l}

1

您想使用纯Python官方文档中等价于itertools.permutations的内容吗?


0

请尝试这个,

>>> import itertools
>>> print list(itertools.permutations([True, True , False], 3))

输出

[(True, True, False), (True, False, True), (True, True, False), (True, False, True), (False, True, True), (False, True, True)]

或者试试这个:

>>> def combiList(l):
        if not l:
            return [[]]
        res = []
        for e in l:
            temp = l[:]
            temp.remove(e)
            res.extend([[e] + r for r in combiList(temp)])

        return res


>>> combiList([True, True , False])
[[True, True, False], [True, False, True], [True, True, False], [True, False, True], [False, True, True], [False, True, True]]
>>>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接