多个列表项的python组合

多个列表项的python组合,python,list,algorithm,itertools,Python,List,Algorithm,Itertools,我有几个列表,比如:[1,2,3],[1,3],[1,2,3,4]。我需要这些值的组合(长度等于列表的数量)。问题是itertools.product执行所有组合(例如,我不希望(1,1,1),因为所有项都是相同的,或者[(1,3,2),(2,3,1)],因为项1和项3只会切换。我编写了一个解决方案,其中元组中的项是唯一的,排序后的结果不包含相同的元组 a=list(itertools.product(*[1,2,3],[1,3],[1,2,3,4])) res=[] 对于a中的项目: 如果(l

我有几个列表,比如:
[1,2,3],[1,3],[1,2,3,4]
。我需要这些值的组合(长度等于列表的数量)。问题是itertools.product执行所有组合(例如,我不希望
(1,1,1)
,因为所有项都是相同的,或者
[(1,3,2),(2,3,1)]
,因为项1和项3只会切换。我编写了一个解决方案,其中元组中的项是唯一的,排序后的结果不包含相同的元组

a=list(itertools.product(*[1,2,3],[1,3],[1,2,3,4]))
res=[]
对于a中的项目:
如果(len(项目)=len(set(项目)):
是唯一的吗
对于r in res:
如果已排序(项目)=已排序(r):
is_unique=False
如果是唯一的:
res.append(项目)
因此:

[(1,3,2)、(1,3,4)、(2,1,4)、(2,3,4)]
第一个问题是,如果我有几个数组,并且每个数组都包含许多值(位置),那么这个代码非常耗时。第二个问题是它取决于元组中的顺序(第二个位置只能是1和3),因此我不能对输入列表中的所有唯一值使用
itertools.composition()


有更好的解决方案吗?

这里有一个使用
set
len
过滤重复项的解决方案:

ll=[[1,2,3],[1,3],[1,2,3,4]]
c1=itertools.product(*ll)
# [(1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 1, 4), (1, 3, 1), (1, 3, 2), (1, 3, 3), (1, 3, 4), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 1, 4), (2, 3, 1), (2, 3, 2), (2, 3, 3), (2, 3, 4), (3, 1, 1), (3, 1, 2), (3, 1, 3), (3, 1, 4), (3, 3, 1), (3, 3, 2), (3, 3, 3), (3, 3, 4)]
c2=设置(c1中c的冻结设置(c)
#{frozenset({3,4})、frozenset({1,4})、frozenset({2,3,4})、frozenset({1,2,4})、frozenset({1,2})、frozenset({3})、frozenset({1,2,3})、frozenset({1,2,3})、frozenset({1,3,4})
c3=设置(如果len(c)=len(ll),则c2中的c为c)
#{frozenset({1,2,3})、frozenset({2,3,4})、frozenset({1,3,4})、frozenset({1,2,4})

您的代码很好,但是for循环非常耗时。请尝试以下方法:

a = list(itertools.product(*[[1,2,3],[1,3],[1,2,3,4]]))
s = set()
res = []
for item in a:
    if (len(item) == len(set(item))):
        k=tuple(sorted(item))
        if k not in s: 
            res.append(item)
            s.add(k)
输出:

>>> print(res)
[(1, 3, 2), (1, 3, 4), (2, 1, 4), (2, 3, 4)]

您是否使用了
itertools.combinations()
itertools.combinations()
只有一个列表作为输入,而我有不止一个。告诉你有效结果是什么的规则是什么?如果每个职位都有不同的候选人,那么如果你得到两个不同顺序的相同输出又有什么关系呢?你打算对结果做什么?每个列表到组合c包含不同对象的允许值。这就是结果顺序重要的原因。因此,您希望所有组合都具有:1)每个列表中有一个项2)结果中没有重复项3)排序时每个结果都是唯一的(没有特定项组合的排列)这些都对吗?谢谢!它的速度是原来的两倍多,这不仅是因为“for loop”,还因为在保存到set之前,对每个元组只进行一次元组排序。