代码之家  ›  专栏  ›  技术社区  ›  Anonymous

生成真/假的所有长度n排列?

  •  2
  • Anonymous  · 技术社区  · 5 年前

    如何生成所有长度为真和假的n个排列的列表?换句话说,给定一个元素列表 [True, False] ,如何生成这些元素的所有可能长度n组合的所有置换?

    例如:

    n=2 长度为2的排列为:

    [[True, True], [True, False], [False, True], [False, False]]
    

    n=3

    [[False, False, False],[False,False,True],
    [False,True,False],[False,True,True],
    [True,False,False],[True,False,True],[True,True,False],[True,True,True]]
    

    我知道这个列表中有2^n个列表。我也考虑过使用 itertools.product ,但这似乎只是给了我们一个机会 特定组合的置换

    6 回复  |  直到 5 年前
        1
  •  19
  •   U13-Forward    3 年前

    使用 itertools.product

    >>> import itertools
    >>> l = [False, True]
    >>> list(itertools.product(l, repeat=3))
    [(False, False, False), (False, False, True), (False, True, False), (False, True, True), (True, False, False), (True, False, True), (True, True, False), (True, True, True)]
    >>> 
    

    如果要将列表中的元组更改为子列表,请尝试列表理解:

    >>> import itertools
    >>> l = [False, True]
    >>> [list(i) for i in itertools.product(l, repeat=3)]
    [[False, False, False], [False, False, True], [False, True, False], [False, True, True], [True, False, False], [True, False, True], [True, True, False], [True, True, True]]
    >>> 
    
        2
  •  6
  •   Some programmer dude    5 年前

    如果你认为价值是相对容易的 相反喜欢 n = 3 大小写,将其视为包含三位的值。

    0 2ⁿ - 1 (包括)并打印每个值中的所有位(带 0 存在 False 1 存在 True ).那么你将拥有所有的排列。

    当然,这不是一个非常符合Python的解决方案,但它是通用的。

        3
  •  3
  •   iz_    5 年前

    尝试 itertools.product repeat

    In [1]: from itertools import product
    
    In [2]: product([True, False], repeat=2)
    Out[2]: <itertools.product at 0x1c7eff51b40>
    

    正如您在上面看到的,它返回一个iterable,所以将其包装在 list() :

    In [3]: list(product([True, False], repeat=2))
    Out[3]: [(True, True), (True, False), (False, True), (False, False)]
    
    In [4]: list(product([True, False], repeat=3))
    Out[4]:
    [(True, True, True),
     (True, True, False),
     (True, False, True),
     (True, False, False),
     (False, True, True),
     (False, True, False),
     (False, False, True),
     (False, False, False)]
    
    In [5]: list(product([True, False], repeat=5))
    Out[5]:
    [(True, True, True, True, True),
     (True, True, True, True, False),
     (True, True, True, False, True),
     (True, True, True, False, False),
     (True, True, False, True, True),
    ...
    

    它还返回一个元组列表,而不是列表列表,但对于大多数用例来说,这应该很好,如果确实需要列表,可以通过列表理解非常容易地解决:

    [list(tup) for tup in mylist]
    
        4
  •  2
  •   zabop    5 年前

    U9-Forward answer :

    import itertools
    l=[False,True]
    ll=list(itertools.product(l,repeat=3))
    

    lll=[]
    for each in ll:
        lll.append([EACH for EACH in each])
    

    lll 将是列表的列表,而不是元组。


    好得多的方法,以下评论:

    [list(elem) for elem in lll]
    

    Kevin .

        5
  •  2
  •   Ralph Yozzo    4 年前

    下面是一个简单的递归列表程序

    def list_exponential(n,set1=[]):
    if n == 0:
        print(set1)
    else:
        n-=1
        list_exponential(n, [False]+set1)
        list_exponential(n, [True]+set1)
    
    list_exponential(5)
    

    样本输出

    $ python3 exponential.py 5
    [False, False, False, False, False]
    [True, False, False, False, False]
    [False, True, False, False, False]
    [True, True, False, False, False]
    [False, False, True, False, False]
    [True, False, True, False, False]
    [False, True, True, False, False]
    [True, True, True, False, False]
    [False, False, False, True, False]
    [True, False, False, True, False]
    [False, True, False, True, False]
    [True, True, False, True, False]
    [False, False, True, True, False]
    [True, False, True, True, False]
    [False, True, True, True, False]
    [True, True, True, True, False]
    [False, False, False, False, True]
    [True, False, False, False, True]
    [False, True, False, False, True]
    [True, True, False, False, True]
    [False, False, True, False, True]
    [True, False, True, False, True]
    [False, True, True, False, True]
    [True, True, True, False, True]
    [False, False, False, True, True]
    [True, False, False, True, True]
    [False, True, False, True, True]
    [True, True, False, True, True]
    [False, False, True, True, True]
    [True, False, True, True, True]
    [False, True, True, True, True]
    [True, True, True, True, True]
    
        6
  •  1
  •   hamza tuna    5 年前

    这不是有效的解决方案,但您可以使用:

    def permuteBool(n, l):
    ...      if n==0:
    ...         return l
    ...      return [permuteBool(n-1, l+[True])] + [permuteBool(n-1, l+[False])]
    ... 
    >>> permuteBool(3, [])
    [[[[True, True, True], [True, True, False]], [[True, False, True], [True, False, False]]], [[[False, True, True], [False, True, False]], [[False, False, True], [False, False, False]]]]
    
        7
  •  1
  •   GeeTransit    5 年前

    使用以下简单代码:

    >>> import itertools  # library of magic
    >>> length = 3        # length of your wanted permutations
    >>> result = itertools.combinations(    # combinations based on position
    ...     [*[True, False] * length],      # generates the items needed
    ...     length                          # length of the wanted results
    ... )
    >>> print([list(r) for in result])
    [[False, False, False], [False, False, True], [False, True, False], [False, True, True], [True, False, False], [True, False, True], [True, True, False], [True, True, True]]