You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

筛选无3个及以上连续数的7数组合,解决文件重复写入问题

问题排查:组合重复写入与连续数校验的问题

首先,咱们先解决你最头疼的重复写入7行的问题——这完全是代码里的一个小疏忽:

你看这段代码:

for i in combinations(data, 7):
    if not any(find_consecutive(i, min_string=3)):
        for x in i:
            f.write(str(i))
            f.write('\n')

这里的内层循环for x in i:完全没必要!你本来只想把每个符合条件的组合i写一次,但现在循环了7次(因为每个组合有7个元素),每次都写一遍整个组合,自然每个组合会被重复写入7行。直接把内层循环去掉,改成一次写入就好:

for i in combinations(data, 7):
    if not any(find_consecutive(i, min_string=3)):
        f.write(f"{i}\n")  # 或者用str(i)+'\n'

接下来,咱们聊聊连续数校验函数find_consecutive里的坑:

你的代码里用了map(itemgetter(1), g),然后直接取len(num_string)——但在Python里,map返回的是迭代器,不是列表,直接用len()会出问题(Python3里会报错,Python2里虽然不会,但也得不到正确的长度)。而且你的lambda写法lambda (i,x):i-x是Python2的专属语法,在Python3里会直接报错,得改成lambda pair: pair[0] - pair[1]。

修正后的find_consecutive函数应该是这样的:

def find_consecutive(lst, min_string=3):
    for k, g in groupby(enumerate(lst), lambda pair: pair[0] - pair[1]):
        num_list = list(map(itemgetter(1), g))  # 转成列表才能正确取长度
        if len(num_list) >= min_string:
            yield num_list

这样才能准确识别出3个及以上的连续数字序列。

最后说说你提到的组合数量问题:56选7的总组合数确实是C(56,7)=231917400(约2.3亿),而排除掉包含3个及以上连续数的组合后,符合条件的数量肯定会少很多,这个逻辑是完全正确的。

修正后的完整代码:

from itertools import combinations, groupby
from operator import itemgetter

data = list(range(1, 57))  # 简化生成1到56的列表

def find_consecutive(lst, min_string=3):
    for k, g in groupby(enumerate(lst), lambda pair: pair[0] - pair[1]):
        num_list = list(map(itemgetter(1), g))
        if len(num_list) >= min_string:
            yield num_list

with open('7.txt', 'w') as f:  # 用with语句更安全,自动处理文件关闭
    for combo in combinations(data, 7):
        if not any(find_consecutive(combo, min_string=3)):
            f.write(f"{combo}\n")

内容的提问来源于stack exchange,提问作者dvdrbls

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:41:01