Python 剔除具有特定条件的组合

Python 剔除具有特定条件的组合,python,python-3.x,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 (combinat

我是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,因此应将其输出。我希望这是有意义的


有谁能指导我完成思考过程并提出一个简单的方法吗?

您可以使用列表理解来限制生成的值保留在列表中:

from itertools import combinations

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

print (comb)
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)
输出:

[(1, 6), (1, 7), (1, 8), ... snipp ..., (93, 99), (93, 100), (94, 99), (94, 100), (95, 100)]
组合尊重数字的顺序,因此不需要x[1]-x[0]附近的abs-范围本身是一个序列,并且由于if x[1]-x[0]>4条件,您的结果列表会删除所有您不想要的数字。

您可以使用它,然后对结果进行迭代

此外,对于迭代器,您希望在转换为具有列表的列表之前,等待真正需要一个列表。在这种情况下,没有理由这样做,因为您总是在迭代。这使您能够处理非常大的集合,而不需要占用内存和运行迭代器的时间,只需创建一个列表,然后对列表进行迭代:

from itertools import combinations

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

print (comb)
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和fitleredfalse生成的迭代器都是惰性的,因此在您开始循环之前,它们永远不会开始计算。这允许您将任何工作推迟到需要完成之前,或者在不计算整个内容的情况下迭代一个大集合的一部分。

这应该可以完成您的要求:

>>> 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) ...

嘿,欢迎来到Stack Overflow!请回答您的问题以正确设置代码的格式。选择它,然后点击Control+K或使用旁边的{}按钮。i_list=ListRange1101,您甚至不需要生成列表-将Range1101直接提供给组合。好的,这很有意义。我想我必须生成一个列表,这样我就有东西可以输入到组合迭代器中。谢谢。使用itertools.filterfalse和filter有什么区别吗?除此之外,过滤器返回满足谓词的项,而过滤器则对不满足谓词的项进行模拟?不太多@asikorski-它们都生成迭代器。我喜欢这里的filterfalse,因为这里的条件是剔除东西,而不是包括东西。我只是觉得讲道理比较容易。非常感谢。这很有道理。这是一种只生产你首先需要的东西的好方法