Поиск подмножества Список Python Список на основе входного целого числа - PullRequest
2 голосов
/ 09 января 2020

Я хочу получить список подмножеств из списка ввода на основе целочисленного значения ввода.

Например:

Input List: [3,7,9,11,12]
Input Value: 2
Output List: [1,7,9,11,12]
# 2 is subtracted from first element of list

Input List: [3,7,9,11,12]
Input Value: 5
Output List: [5,9,11,12]
#5 is subtracted from list in sequence manner, first 3 is subtracted then remaining 2 is subtracted from 7 hence output is [5,9,11,12]

Ответы [ 3 ]

2 голосов
/ 09 января 2020

Рекурсивное решение:

def subfrom( lst, n ):
    if n<=0 or lst == []:
        # No change necessary
        return lst
    if lst[0] <= n:
        # First element gets removed
        # Return the list you get by removing the leftover from the rest of the list
        return subfrom( lst[1:], n-lst[0] )
    # Reducde first element
    return [lst[0]-n] + lst[1:]
2 голосов
/ 09 января 2020

Используйте numpy.cumsum(), если разрешены модули:

import numpy as np
input_list = np.asarray([3, 7, 9, 11, 12])
input_integer = 5
output_list = input_list[input_list.cumsum() > input_integer]
output_list[0] -= input_integer - input_list[input_list.cumsum() <= input_integer].sum()
print(output_list)

Вывод:

[ 5  9 11 12]

Что я там делал:

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

Затем установите первый элемент = первый элемент - (input_integer - сумма обрезанного списка)

0 голосов
/ 09 января 2020

Другое решение:

# First set of test variables
list1 = [3,7,9,11,12]
input1 = 2

# Second set of test variables
list2 = [3,7,9,11,12]
input2 = 5

def eval_list(input_value, iterable, output = None):
    if output is None:
        output = []

    for i, v in enumerate(iterable):
        current = iterable[i]
        if input_value > 0:
            if v <= input_value:
                input_value -= current
            else:
                current -= input_value
                input_value = 0
                output.append(current)
        else:
            output.append(current)

    return output

Запуск для каждого набора данных и вывод результатов:

res1 = eval_list(input1, list1)
res2 = eval_list(input2, list2)

print(f"Set 1: {res1}")
print(f"Set 2: {res2}")

Вывод:

Set 1: [1, 7, 9, 11, 12]
Set 2: [5, 9, 11, 12]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...