使用itertools的一组变量列表中的总组合

时间:2018-04-11 01:13:02

标签: python list itertools

我正在使用python,我相信下面的问题可以使用itertools解决,但如果有其他方法请告诉我。

如果我有一个变量列表(为了便于说明,请将它设为3),每个列表包含一个变量元素集(元素可以是字符串,整数,列表)。

一个例子:

                          [a,b,c]   [d,e,f]   [g,h,i]

如何创建(和访问)所有可能的组合(最好是列表),每组只选一个?

即。

并[a,d,G]

并[a,d,H]

并[a,d,i]于

[A,E,G]

...(依此类推)

顺序无关紧要,因此对于输出我不希望[a,d,g]和[d,a,g]都显示,只需要[a,d,g]。

如果我的问题不明确,请告诉我。

此外,如果它有助于我们可以将所有元素视为简单的字符串或整数,但我想要一个解决方案,计算列表的数量和每个列表中的元素数量是可变的这一事实。

2 个答案:

答案 0 :(得分:0)

我没有动摇标记为重复,但我认为您需要itertools.product,如下所述:pick combinations from multiple lists

答案 1 :(得分:0)

您可以使用深度优先搜索来解决它:

def find_all_combinations(lists):
    res = set() #set so no duplicates
    def dfs(curr_index, curr_combination):
        if curr_index == len(lists): #base case - add to results and stop
            res.add(tuple(sorted(curr_combination)))
        else:
            for i in lists[curr_index]: #iterate through each val in cur index
                dfs(curr_index + 1, curr_combination + [i]) #add and repeat for next index
    dfs(0, [])
    return sorted(list(res))

print(find_all_combinations(l))
>>>[('a', 'd', 'g'), ('a', 'd', 'h'), ('a', 'd', 'i'), ('a', 'e', 'g'), ('a', 'e', 'h'), ('a', 'e', 'i'), ('a', 'f', 'g'), ('a', 'f', 'h'), ('a', 'f', 'i'), ('b', 'd', 'g'), ('b', 'd', 'h'), ('b', 'd', 'i'), ('b', 'e', 'g'), ('b', 'e', 'h'), ('b', 'e', 'i'), ('b', 'f', 'g'), ('b', 'f', 'h'), ('b', 'f', 'i'), ('c', 'd', 'g'), ('c', 'd', 'h'), ('c', 'd', 'i'), ('c', 'e', 'g'), ('c', 'e', 'h'), ('c', 'e', 'i'), ('c', 'f', 'g'), ('c', 'f', 'h'), ('c', 'f', 'i')]

此外,所有列表的长度都不一样。