All possible replacements of two lists?

后端 未结 3 1307
长发绾君心
长发绾君心 2020-12-11 20:53

(I am aware that the title of the question might be misleading, but I could not find any other way to formulate it - feel free to edit it)

I have two lists, both of

相关标签:
3条回答
  • 2020-12-11 21:25

    Creating 3 lists of two elements would not over-complicate the code at all. zip can "flip the axes" of multiple lists trivially (making X sequences of Y elements into Y sequences of X elements), making it easy to use itertools.product:

    import itertools
    
    a = [1,2,3]
    b = [4,5,6]
    
    # Unpacking result of zip(a, b) means you automatically pass
    # (1, 4), (2, 5), (3, 6)
    # as the arguments to itertools.product
    output = list(itertools.product(*zip(a, b)))
    
    print(*output, sep="\n")
    

    Which outputs:

    (1, 2, 3)
    (1, 2, 6)
    (1, 5, 3)
    (1, 5, 6)
    (4, 2, 3)
    (4, 2, 6)
    (4, 5, 3)
    (4, 5, 6)
    

    Different ordering than your example output, but it's the same set of possible replacements.

    0 讨论(0)
  • 2020-12-11 21:27

    Okay this is similar to the other answers, but taking a bit from both. You can model your problem as finding all possible bits of a sequence of given length, and replacing only when there is 1, and otherwise not.

    from itertools import product
    
    a = [1,2,3]
    b = [4,5,6]
    
    ## All binary combinations of length of a (or b)
    combinations = product([0,1], repeat=len(a))
    
    for combination in combinations:
        y = []
        for l, i in zip(zip(a,b),combination):
             y.append(l[i])
        print y
    

    All combinations of bits are:

    (0, 0, 0)
    (0, 0, 1)
    (0, 1, 0)
    (0, 1, 1)
    (1, 0, 0)
    (1, 0, 1)
    (1, 1, 0)
    (1, 1, 1)
    

    Which results in:

    [1, 2, 3]
    [1, 2, 6]
    [1, 5, 3]
    [1, 5, 6]
    [4, 2, 3]
    [4, 2, 6]
    [4, 5, 3]
    [4, 5, 6]
    
    0 讨论(0)
  • 2020-12-11 21:32

    Each item may independently be replaced or left alone. This can be modeled by a bit being 1 or 0. If you consider each item to be a separate bit, then iterating over all of the possibilities can be mapped to iterating over all of the combinations of n bits.

    In other words, iterate from 0 to 2n-1 and look at the bit patterns.

    n = len(a)
    for i in range(2**n):
        yield [a[j] if i & (1 << j) != 0 else b[j] for j in range(n)]
    

    Breaking this down, i & (1 << j) != 0 checks if the jth bit of i is set. If it is, use a[j], otherwise b[j].

    Result:

    [1, 2, 3]
    [4, 2, 3]
    [1, 5, 3]
    [4, 5, 3]
    [1, 2, 6]
    [4, 2, 6]
    [1, 5, 6]
    [4, 5, 6]
    
    0 讨论(0)
提交回复
热议问题