使用重复列表生成多个列表中的所有组合

时间:2015-08-24 23:54:06

标签: python list combinations

我有多个列表,其中一些是重复,我需要所有组合,不包括选择重复列表中相同元素的组合。例如,我有

import itertools
list1 = [1,2,3]
list2 = [4,5,6]
list3 = [4,5,6]
list4 = [7,8,9]
a = [list1,list2,list3,list4]
print list(itertools.product(*a))

输出

(1,4,4,7)
(1,4,4,8)
(1,4,4,9)
(1,4,5,7)
.
.
.

等,正如您所期望的那样,但我想要它做的是输出每个组合,而不重复列表2和3中的元素。像这样:

(1,4,5,7)
(1,4,5,8)
(1,4,5,9)
(1,4,6,7)
(1,4,6,8)
(1,4,6,9)
(1,5,6,7)
(1,5,6,8)
(1,5,6,9)
(2,4,5,7)
.
.
.

我显然希望避免在创建列表后手动删除它们,但是对于如何有效地执行此操作的任何帮助都非常感激。感谢。

1 个答案:

答案 0 :(得分:0)

简单的方法是使用过滤器生成表达式:

print list(item for item in itertools.product(*a) if item[1] != item[2])

如果两个项目包含相同的元素,则认为它们相同,并且如果每个项目都保证不包含重复元素,则可以通过将重复项目更改为set并仅将其添加到list来丢弃重复项目。 {1}}如果它们尚未包含在其中:

result = []
for item in itertools.product(*a):
    if item[1]==item[2]:
        continue
    item = set(item)
    if item not in result:
        result.append(item)

print result