从列表列表中创建组合

时间:2018-02-22 19:36:42

标签: python list combinations

我试图弄清楚如何获取整数列表列表并创建一个包含列表列表组合的新列表。我希望组合从第一个列表中的值开始,然后分别从每个后续列表中取1,只有当值大于上一个列表时才会使用。

l=[[1,2,3],[4,8],[5,10]]



# the answer would look like this 
correct=[[1,4,5],[1,4,10],[1,8,10],[2,4,5],[2,4,10],[2,8,10],[3,4,5],[3,4,10],[3,8,10]]

3 个答案:

答案 0 :(得分:2)

列表理解可能是一个很好的方法。由于你的约束,它很好地工作。你可能想要这样的东西:

[[i,j,k] for i in l[0] for j in l[1] if j>i for k in l[2] if k>j]
>>> [[1, 4, 5],
    [1, 4, 10],
    [1, 8, 10],
    [2, 4, 5],
    [2, 4, 10],
    [2, 8, 10],
    [3, 4, 5],
    [3, 4, 10],
    [3, 8, 10]]

如果j> i和l [2]中的所有k,则为l [1]中的所有j的l [0]中的所有i的形式[i,j,k]的列表列表[2] ]如果k> j(因为我们已经知道j> i)

但是,上面的代码仅适用于长度为3的列表的输入列表。稍微了解一下,但这种递归方法适用于任何长度的输入列表

def list_of_lists(in_list):
    full_list=[]

    def recurse(so_far, l):
        if l==len(in_list):
            return so_far 
        next_list = in_list[l]
        for i in next_list:
            if i>so_far[-1]:
                new_list = recurse(so_far.copy()+[i], l+1)
                if new_list:
                    full_list.append(new_list)

    for i in in_list[0]:
        recurse([i],1)
    return full_list

答案 1 :(得分:1)

>>> from itertools import product
... 
... 
... def combos(lst):
...     result = []
...     for p in product(*lst):
...         if all(a < b for a, b in zip(p, p[1:])):
...             result.append(list(p))
...     return result
... 
>>> lst = [[1, 2, 3], [4, 8], [5, 10]]
>>> correct = [[1, 4, 5], [1, 4, 10], [1, 8, 10], [2, 4, 5], [2, 4, 10],
...            [2, 8, 10], [3, 4, 5], [3, 4, 10], [3, 8, 10]]
>>> combos(lst) == correct
True

答案 2 :(得分:0)

val bytes = ip"192.168.1.15"