繁体   English   中英

几个列表项的python组合

[英]python combination of several lists items

我有几个列表,如: [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 = []
for item in a:
    if (len(item) == len(set(item))):
        is_unique = True
        for r in res:
            if sorted(item) == sorted(r):
                is_unique = False
        if is_unique:
            res.append(item)

结果如下:

[(1, 3, 2), (1, 3, 4), (2, 1, 4), (2, 3, 4)]

第一个问题是,如果我有多个数组并且每个数组都包含许多值(位置),那么这段代码真的很耗时。 第二个问题是它取决于元组中的顺序(第二个位置只能是 1 和 3),所以我不能对输入列表中的所有唯一值使用itertools.combination()

有没有更好的解决办法?

这是使用setlen过滤掉重复项的解决方案:

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 = set(frozenset(c) for c in c1)
# {frozenset({3, 4}), frozenset({1, 4}), frozenset({2, 3, 4}), frozenset({2, 3}), frozenset({1, 2, 4}), frozenset({1, 2}), frozenset({3}), frozenset({1}), frozenset({1, 2, 3}), frozenset({1, 3}), frozenset({1, 3, 4})}
c3 = set(c for c in c2 if len(c) == len(ll))
# {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)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM