Python 减少一个组合,消除两个以上连续的行

Python 减少一个组合,消除两个以上连续的行,python,combinations,itertools,Python,Combinations,Itertools,我试图让这个工作,并打印到一个文件,因为这是更快,但我不知道为什么它打印7行从每个结果以一个巨大的文件结束,我做错了什么? 我想要从1到56中选择7个数字,每个迭代中不超过2个连续的数字,一个排列会产生2.3亿个结果,所以我认为这个数字必须更小, 谢谢大家! from itertools import combinations, groupby from operator import itemgetter f= open('7.txt','w') data = [1,2,3,4,5,6,7,

我试图让这个工作,并打印到一个文件,因为这是更快,但我不知道为什么它打印7行从每个结果以一个巨大的文件结束,我做错了什么? 我想要从1到56中选择7个数字,每个迭代中不超过2个连续的数字,一个排列会产生2.3亿个结果,所以我认为这个数字必须更小, 谢谢大家!

from itertools import combinations, groupby
from operator import itemgetter
f= open('7.txt','w')

data = [1,2,3,4,5,6,7,8,9,10,11,
        12,13,14,15,16,17,18,19,
        20,21,22,23,24,25,26,27,
        28,29,30,31,32,33,34,35,
        36,37,38,39,40,41,42,43,
        44,45,46,47,48,49,50,51,
        52,53,54,55,56]

def find_consecutive(lst, min_string=3):
    for k, g in groupby(enumerate(lst), lambda (i,x):i-x):
        num_string = map(itemgetter(1), g)
        if len(num_string) >= 3:
            yield num_string

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')
f.close()

find_continuous
不会做您认为它会做的事情

尝试以下更简单的功能:

def has_consecutive(lst, min_repeat=3):
    if not lst:
        return False
    last = lst[0]
    counter = 1
    for n in lst[1:]:
        if n == last:
            counter += 1
            if min_repeat <= counter:
                return True
        else:
            counter = 1
            last = n
    return False

for c in combinations(data, 7):
    if not has_consecutive(c):
        ...
def具有连续(lst,min\u repeat=3):
如果不是lst:
返回错误
last=lst[0]
计数器=1
对于lst[1:]中的n:
如果n==最后一个:
计数器+=1

如果min_repeat
find_Continuous
没有按您认为的那样执行

尝试以下更简单的功能:

def has_consecutive(lst, min_repeat=3):
    if not lst:
        return False
    last = lst[0]
    counter = 1
    for n in lst[1:]:
        if n == last:
            counter += 1
            if min_repeat <= counter:
                return True
        else:
            counter = 1
            last = n
    return False

for c in combinations(data, 7):
    if not has_consecutive(c):
        ...
def具有连续(lst,min\u repeat=3):
如果不是lst:
返回错误
last=lst[0]
计数器=1
对于lst[1:]中的n:
如果n==最后一个:
计数器+=1

如果min_repeat您的代码可以简化如下

更改:

  • 请注意,为了便于测试,我用print替换了文件写入代码
  • 我已将您的数据更改为范围
  • 已更改连续编号功能
  • 将x写入文件而不是i
来自itertools导入组合、分组依据、计数
从运算符导入itemgetter
数据=范围(1,57)
def具有连续编号(lst,最小字符串=3):
lst=已排序(lst)
连续=[i-j代表i,j在zip中(lst[1:],lst[:-1])。计数(1)

如果连续您的代码可以简化如下

更改:

  • 请注意,为了便于测试,我用print替换了文件写入代码
  • 我已将您的数据更改为范围
  • 已更改连续编号功能
  • 将x写入文件而不是i
来自itertools导入组合、分组依据、计数
从运算符导入itemgetter
数据=范围(1,57)
def具有连续编号(lst,最小字符串=3):
lst=已排序(lst)
连续=[i-j代表i,j在zip中(lst[1:],lst[:-1])。计数(1)

如果你愿意,谢谢你!它仍然给出连续的值,我做错了什么?另一个问题是您在I:write(I)
中为x编写了
,应该是
write(I)
谢谢!它仍然给出连续的值,我做错了什么?另一个问题是你在I:write(I)
中为x编写了
,应该是
write(I)
谢谢,我有这个错误,我需要怎么做///如果没有(find_contracted(I,min_string=3)):name错误:name“find_contracted”没有定义对不起,有一个错误,我现在就更正了代码,它工作了,这是一个问题,因为它在shell I和x中打印两个解决方案,并且为了避免在开始时使用1,2,3,必须将min_字符串更改为=2,但到目前为止仍然工作,谢谢!欢迎,请考虑标记它解决和投票:谢谢你,Im有这个错误,我需要做什么/ /如果没有任何(Fixy Stand(i,MixSnc= 3)):NealError:名称“FixyStand”是不确定的,有一些bug我纠正了代码,它工作了一个问题,因为它是在shell I和X中打印两个解决方案,为了避免在开始时使用1,2,3,必须将min_字符串更改为=2,但到目前为止仍然有效,谢谢!欢迎,请考虑将其解决并投票: