带有条件的列表元素的Python组合

时间:2019-04-17 21:50:17

标签: python

我在python中找到itertools.combinations()函数的源代码。看起来像这样。

def combinations(iterable, r):
pool = tuple(iterable)
n = len(pool)
if r > n:
    return
indices = list(range(r))
print(indices)
yield tuple(pool[i] for i in indices)
while True:
    for i in reversed(range(r)):
        if indices[i] != i + n - r:
            break
    else:
        return
    indices[i] += 1
    for j in range(i+1, r):
        indices[j] = indices[j-1] + 1
    print(indices)
    yield tuple(pool[i] for i in indices)

我有这样的元组:

pairs = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]

我需要生成所有可能组合的四人组合,但有条件的是,列表中始终只有两个相同的数字。因此,在这种情况下,我要生成这3个列表:

((0, 1), (0, 2), (1, 3), (2, 3))
((0, 1), (0, 3), (1, 2), (2, 3))
((0, 2), (0, 3), (1, 2), (1, 3))

我真正需要的是更新世代组合的代码,因为在我的真实应用中,我需要从80个元组中生成23位数。生成和过滤之后要花费很多时间,这就是为什么我需要在一部分生成中捕获问题。

1 个答案:

答案 0 :(得分:0)

您可以使用enter image description here,然后使用itertools.combinations过滤结果:

from collections import Counter
import itertools as it

pairs = [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
result = filter(
    lambda x: max(Counter(it.chain(*x)).values()) < 3,
    it.combinations(pairs, 4)
)
print(list(result))

输出:

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