уменьшить комбинацию, исключая строки с более чем двумя последовательными - PullRequest
1 голос
/ 19 сентября 2019

я пытаюсь заставить это работать и печатать в файл, потому что это быстрее, но я не знаю, почему он печатает 7 строк из каждого результата, заканчивающегося огромным файлом, что я делаю неправильно?Я хочу, чтобы 7 чисел были выбраны от 1 до 56 и не более 2 последовательных в каждой итерации, перестановка дает примерно 230 миллионов результатов, поэтому я думаю, что это должно быть меньше, спасибо!

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

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Ваш код может быть упрощен, как показано ниже.

Изменения:

  • обратите внимание, что я заменил код записи файла на печать для простоты тестирования
  • Я изменил ваши данные на диапазон
  • Изменена функция has_consecutive_number
  • запись x в файл вместо i
from itertools import combinations, groupby, count
from operator import itemgetter

data = range(1,57)

def has_consecutive_number(lst, min_string=3):
    lst = sorted(lst)
    consecutives = [i-j for i,j in zip(lst[1:], lst[:-1])].count(1)
    if consecutives<min_string:
        return True

    return False

with open('7.txt','w') as f:
    for i in combinations(data, 7):
        if has_consecutive_number(i, min_string=3):
            print(i)
            for x in i:
                print(x)


0 голосов
/ 19 сентября 2019

find_consecutive делает не то, что вы думаете.

Попробуйте эту более простую функцию:

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