Мне не совсем понятно, что вы считаете приемлемым выводом, поэтому я предполагаю, что это любой список, в котором его элементы суммируют меньше 100.
Решение, которое я нашел, использует рекурсию. Для списка [a, b, c, d] мы собираемся проверить условие для этих подсписков:
[a]
[a, b] (if the condition for [a] is met)
[a, b, c] (if the condition for [a, b] is met)
[a, b, c, d] (if the condition for [a, b, c] is met)
[a, c] (if the condition for [a] is met)
[a, c, d] (if the condition for [a, c] is met)
[a, d] (if the condition for [a] is met)
[b]
[b, c] (if the condition for [b] is met)
[b, c, d] (if the condition for [b, c] is met)
[b, d] (if the condition for [b] is met)
[c]
[c, d] (if the condition for [c] is met)
[d]
Концепция состоит в том, что для элемента "n" в списке мы собираемся искать подсписки размером от «n - 1» до 0 (то есть сам элемент), которые отвечают требованиям. Подсписки формируются элементами справа от исследуемого элемента каждой итерации, поэтому для первых 30 подсписок будет использоваться [30, 30, 30, 20, 10, 5, 4, 3, 2, 1 ]
Этот процесс поиска подсписков для каждого элемента использует рекурсию. Он вызывает себя для каждого элемента подсписков, проверяя, соответствует ли оно условию. Для приведенного выше примера, если условие выполнено для [a, b], то оно также попытается использовать [a, b, c] и [a, b, d] (вызывая себя с суммой (a, b) и подсписок [c, d].
Я добавил несколько отпечатков, чтобы вы могли изучить, как это работает, но вам просто нужно использовать переменную результатов в конце скрипта для получения ваших результатов .
main_list = [80,80,30,30,30,30,20,10,5,4,3,2,1]
def less_than_hundred(input) -> bool:
return input < 100
def sublists_meet_condition(condition, input):
"""
This function is used to call the sublists_for_element function with every element in the original list and its sublist:
- For the first element (80) it calls the second function with the sublist [80,30,30,30,30,20,10,5,4,3,2,1]
- For the fifth element (30) it calls the second function with the sublist [30,20,10,5,4,3,2,1]
Its purpose is to collect all the sublists that meet the requirements for each element
"""
results = []
for index, element in enumerate(input):
print('Iteration {} - Element {}'.format(index, element))
if condition(element):
results.append([element])
print('{} = {}'.format([element], element))
num_elements = len(input) - index
main_element = element
sublist = input[index+1:]
for result in sublists_for_element(condition, main_element, sublist):
new_result = [element] + result
sum_new_result = sum(new_result)
results.append(new_result)
print('{} = {}'.format([element] + result, sum_new_result))
return results
def sublists_for_element(condition, sum_main_elements, sublist):
"""
This function is used to check every sublist with the given condition.
The variable sum_main_elements allows the function to call itself and check if for a given list of numbers that meet the conditions [30, 30, 4] for example, any of the elements of the remaining sublists also meets the condition for example adding the number 3 still meets the condition.
Its purpose is to return all the sublists that meet the requirements for the given sum of main elements and remaining sublist
"""
num_elements = '{}{}'.format('0' if len(sublist) + 1 < 10 else '',len(sublist) + 1)
#print('Elements: {} | Main element: {} | Sublist: {}'.format(num_elements, sum_main_elements, sublist))
result = []
for index, element in enumerate(sublist):
if condition(sum_main_elements + element):
result.append([element])
sublist_results = sublists_for_element(condition, sum_main_elements + element, sublist[index+1:])
for sublist_result in sublist_results:
result.append([element] + sublist_result)
return result
results = sublists_meet_condition(less_than_hundred, main_list)