[英]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()
。
有没有更好的解决办法?
这是使用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 = 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.