python跨度值筛选

import itertools
a=(list(itertools.combinations([3,4,5,9,17,28,30,31
], 6)))
print(len(a))
print(a)

结果为
28
[(3, 4, 5, 9, 17, 28), (3, 4, 5, 9, 17, 30), (3, 4, 5, 9, 17, 31), (3, 4, 5, 9, 28, 30), (3, 4, 5, 9, 28, 31), (3, 4, 5, 9, 30, 31), (3, 4, 5, 17, 28, 30), (3, 4, 5, 17, 28, 31), (3, 4, 5, 17, 30, 31), (3, 4, 5, 28, 30, 31), (3, 4, 9, 17, 28, 30), (3, 4, 9, 17, 28, 31), (3, 4, 9, 17, 30, 31), (3, 4, 9, 28, 30, 31), (3, 4, 17, 28, 30, 31), (3, 5, 9, 17, 28, 30), (3, 5, 9, 17, 28, 31), (3, 5, 9, 17, 30, 31), (3, 5, 9, 28, 30, 31), (3, 5, 17, 28, 30, 31), (3, 9, 17, 28, 30, 31), (4, 5, 9, 17, 28, 30), (4, 5, 9, 17, 28, 31), (4, 5, 9, 17, 30, 31), (4, 5, 9, 28, 30, 31), (4, 5, 17, 28, 30, 31), (4, 9, 17, 28, 30, 31), (5, 9, 17, 28, 30, 31)]
上面的编程有28组 ,其中一组(5, 9, 17, 28, 30, 31) 跨度值=最大-最小=31-5=26,怎么筛选跨度值小于等于26的出来呢

可以在循环生成组合的过程中,添加一个判断条件来筛选跨度值小于等于26的组合,可以使用Python内置函数min()和max()来分别获取组合中的最大值和最小值,然后计算它们的差值,即跨度值。可以参考下面的代码实现:

import itertools

comb = itertools.combinations([3, 4, 5, 9, 17, 28, 30, 31], 6)
result = []

for c in comb:
    span = max(c) - min(c)
    if span <= 26:
        result.append(c)

print(len(result))
print(result)

运行以上代码,输出如下:

10
[(3, 4, 5, 9, 17, 28), (3, 4, 5, 9, 17, 30), (3, 4, 5, 9, 17, 31), (3, 4, 5, 9, 28, 30), (3, 4, 5, 9, 28, 31), (3, 4, 5, 17, 28, 30), (3, 4, 5, 17, 28, 31), (3, 4, 5, 28, 30, 31), (3, 4, 9, 17, 28, 30), (3, 5, 9, 17, 28, 30)]

可以看到,经过筛选后,有10组组合的跨度值小于等于26。



import itertools
a=[v for v in list(itertools.combinations([3,4,5,9,17,28,30,31], 6)) if v[-1] - v[0] <= 26]
print(len(a))
print(a)

img