Python 减少一个组合,消除两个以上连续的行
我试图让这个工作,并打印到一个文件,因为这是更快,但我不知道为什么它打印7行从每个结果以一个巨大的文件结束,我做错了什么? 我想要从1到56中选择7个数字,每个迭代中不超过2个连续的数字,一个排列会产生2.3亿个结果,所以我认为这个数字必须更小, 谢谢大家!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,
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_repeatfind_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,但到目前为止仍然有效,谢谢!欢迎,请考虑将其解决并投票: