我是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
,因此应将其输出。我希望这是有道理的。
有人可以指导我进行思考并提出一种简单的方法吗?
答案 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) ...