Функция разделения Python - PullRequest
       7

Функция разделения Python

0 голосов
/ 13 ноября 2018

У меня есть следующий код, который я адаптировал из кода, который был ранее размещен на этом сайте. Это разновидность функции разделения, которая выводит все возможные комбинации чисел, которые складываются до указанной суммы, но ограничивает числа, которые могут использоваться для суммы, ограниченным списком ввода.

def part(nr, Nums):
    nrs = sorted(Nums, reverse=True)

    def inner(n, i):
        if n == 0:
            yield []
        for k in range(i, len(nrs)):
            if nrs[k] <= n:
                for rest in inner(n - nrs[k], k):
                    yield [nrs[k]] + rest

    return list(inner(nr, 0))


#List of numbers to form the sums.
Nums = [5,6 ,7 ,8, 9, 10]

#the total that the numbers add up to.
total = 32

tr = part(total, Nums)

print(f"{len(tr)}  Combination of {Nums} in {total} are:")
print(tr)

Результаты:

24 Комбинации [5, 6, 7, 8, 9, 10] в 32:

[[10, 10, 7, 5], [10, 10, 6, 6], [10, 9, 8, 5], [10, 9, 7, 6], [10, 8, 8, 6], [10, 8, 7, 7], [10, 7, 5, 5, 5], [10, 6, 6, 5, 5], [9, 9, 9, 5] , [9, 9, 8, 6], [9, 9, 7, 7], [9, 8, 8, 7], [9, 8, 5, 5, 5], [9, 7, 6, 5, 5], [9, 6, 6, 6, 5], [8, 8, 8, 8], [8, 8, 6, 5, 5], [8, 7, 7, 5, 5] , [8, 7, 6, 6, 5], [8, 6, 6, 6, 6], [7, 7, 7, 6, 5], [7, 7, 6, 6, 6], [ 7, 5, 5, 5, 5, 5], [6, 6, 5, 5, 5, 5]]

Процесс завершен с кодом выхода 0

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

Так, например: "[10, 8, 7, 7], [10, 7, 5, 5, 5]" Эти суммы комбинаций не будут выводиться, поскольку они содержат повторяющиеся числа семь и пять соответственно.

Я пытаюсь сохранить функции генератора, потому что мне сказали, что они имеют лучшую производительность, чем списки, и я мог бы использовать эту же функцию для больших списков и сумм в будущем. Но я не уверен, как проверить генератор на наличие дубликатов, чтобы исключить подсписки, содержащие повторяющиеся числа.

Спасибо.

1 Ответ

0 голосов
/ 13 ноября 2018

Вы можете изменить строку 7 на: for k in range(i + 1, len(nrs)):

...