清除具有特定条件的组合

时间:2019-05-21 17:07:54

标签: python python-3.x

我是python和编程方面的新手,我想提出一些组合,并在一定条件下淘汰组合。

因此,在以下情况下,我尝试生成1-100之间的所有可能组合。但是我不知道该去哪里。

import itertools

i_list = []

for i in range (1, 101):
    i_list.append(i)

comb = itertools.combinations(i_list,2)
for combinations in list(comb):
    print (combinations)

这很好,它将从1-100生成一个列表,并给我输出

(1,2) (1,3).........(98,99) (98,100) (99,100)

现在,我的目标是淘汰差异为< 5的组合,例如:(1,2)差异小于5,因此不应输出。 (1,8)的差异大于5,因此应将其输出。我希望这是有道理的。

有人可以指导我进行思考并提出一种简单的方法吗?

3 个答案:

答案 0 :(得分:4)

您可以为此使用itertools.filterfalse,然后遍历结果。

此外,对于迭代器,您还需要等到真正需要列表后,才能使用if x[1]-x[0]>4转换为列表。在这种情况下,没有理由这样做,因为您总是在迭代。这样一来,您就可以处理非常大的集合,而无需花大量的时间和精力来遍历迭代器,而只是创建一个列表然后对列表进行迭代:

list()

from itertools import combinations, filterfalse comb = combinations(range(1, 101),2) filtered = filterfalse(lambda x: abs(x[0] - x[1]) < 5, comb) for combinations in filtered: print (combinations) range()combinations产生的迭代器都是惰性的,因此直到您开始遍历它们之前,它们才开始评估。这样一来,您就可以将任何工作推迟到需要完成之前,或者遍历大集合的一部分而无需计算整个过程。

答案 1 :(得分:1)

您可以使用列表推导来限制将生成的值保留在列表中:

from itertools import combinations

comb = [ x for x in combinations(range(1,101),2) if x[1]-x[0]>4 ]

print (comb)

输出:

[(1, 6), (1, 7), (1, 8), ... snipp ..., (93, 99), (93, 100), (94, 99), (94, 100), (95, 100)]

combinations遵循数字的顺序,因此不需要abs()周围的x[1]-x[0]-范围本身是一个序列,并且您得到的列表会清除由于{{ 1}}条件。

答案 2 :(得分:1)

这应该可以满足您的要求:

>>> import itertools
>>> combinations = itertools.combinations(range(1, 101), 2)
>>> generator = ((a, b) for a, b in combinations if b - a >= 5)
>>> for pair in generator:
    print(pair, end=' ')


(1, 6) (1, 7) (1, 8) (1, 9) (1, 10) (1, 11) (1, 12) (1, 13) (1, 14) (1, 15) ...

或者,您也可以尝试执行以下操作:

>>> generator = ((a, b) for a in range(1, 96) for b in range(a + 5, 101))
>>> for pair in generator:
    print(pair, end=' ')


(1, 6) (1, 7) (1, 8) (1, 9) (1, 10) (1, 11) (1, 12) (1, 13) (1, 14) (1, 15) ...