Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как заставить этот код работать лучше (список комбинаций)?

Автор вопроса: GeekОтветов: 1
import random

def ordenar(inputx):
    inputx = list(inputx)
    inputx = sorted(inputx, key=int)
    return inputx

def get_numbers(totall):
    return random.sample(numeros, totall)

numeros = [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]

all_jogos = []
maximo_repetido = 9

vezes = 0

while True:
    numbers = get_numbers(15)
    for i in all_jogos:
        total_repetido = len(set(numbers).intersection(i))
        if total_repetido <= maximo_repetido:
            vezes += 1
        else:
            vezes = 0
            break
    if vezes >= len(all_jogos):
        all_jogos.append(numbers)
        print("%s," % ordenar(numbers))

В основном мое намерение состоит в том, чтобы сгенерировать списки из 15 чисел, чтобы между ними повторялось не более 9 чисел (переменная maximo_repetido), создавая как можно больше списков. Сравнение производится со всеми списками, содержащимися в all_jogos, которые растут с каждым циклом, пока условие принимается.

Проблема в том, что все возможные результаты никогда не могут быть получены, поскольку проверка/сравнение выполняется только после генерации 15 случайных чисел.

Как вы делаете условие/проверку/сравнение, когда вы собираетесь генерировать числа, заставляя вас искать только возможные результаты?

  • Примечание: ordenar можно и нужно упростить до return sorted(inputx); входные данные уже представляют собой последовательности целых чисел, поэтому key=int является избыточным, а sorted уже преобразуется в новый list перед сортировкой, поэтому ручное построение списка с list() просто означает дополнительный бессмысленный временный список. ShadowRanger 02.06.2018
  • Это правда, спасибо! Geek 02.06.2018

pythonlistcombinations

Ответы

Ответ 1 · Adam Smith

itertools.combinations(iterable, n) дает вам все комбинации элементов n длины в iterable. Это то, что вы хотите использовать здесь.

import itertools

numbers = range(1, 26)

combos = itertools.combinations(numbers, 15)

combos теперь является итератором (не списком, обратите внимание, поэтому, если вам нужно прочитать его более одного раза, вам нужно явно привести его) всех 15-длинных комбинаций чисел 1-25, и вы можете использовать A* или какой-либо другой алгоритм поиска пути, чтобы найти наилучшее возможное решение.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы