使用输入值Python从列表中选择最大元素

时间:2016-12-02 12:31:13

标签: python max

我正在构建一个程序,从列表中选择总和为给定输入值的最大元素

load_data = [1, 2, 3, 4, 10, 20]

例如,用户输入30选择20 and 10或用户输入35选择20, 10, 4 and 1,因为它们是可能最大的元素,总计为30或{{ 1}}

代码

35

输出始终打印

def process(m): 
    print m


def selection():
    aux = range(len(load_data))
    global value  # <- value is the input 
    while aux and value > 0:
        posit = max(aux) >= value 
        index = aux[posit]
        elem = load_data[index]
        value = value - posit # <- subtract max value from input and repeat process 
        del aux[posit]  
        process(elem)

2 个答案:

答案 0 :(得分:2)

这确实是一项非常复杂的任务。该解决方案仅提供基本方法。它很糟糕,未经审查,例如绩效条款。

import itertools

load_data = [1, 2, 3, 4, 10, 20]
maximum = 35

def selection(data, maximum):
    for count in range(1,len(data)+1):
        for combination in itertools.combinations(data, count):
            if maximum == sum(combination):
                yield combination

i = list(selection(load_data, maximum))
print (i)

请尽量避免使用全局变量。这是非常糟糕的风格。

答案 1 :(得分:2)

你在这里:

load_data

,但正如A. Grieco所说,这对问题来说非常简单和基本。

如果load_data列表是常量,并且始终包含示例中的元素,那么您应该首先对load_data = [1, 2, 3, 4, 10, 20] global value value = 30 def process(m): print m def selection(): # make a local copy of load_data data = sorted(load_data[:],reverse=True) global value # <- value is the input for v in data: if value -v >= 0: value -= v process(v) if value -v == 0: break selection() 进行降序排序,因此出于优化目的,首先处理较大的元素。

即:

SELECT i.descricao, 
       sii.quantidade           quantidade_inicial, 
       sii.quantidade * i.valor valor_inicial, 
       sfi.quantidade           quantidade_final, 
       sfi.quantidade * i.valor valor_final 
FROM   itensvalor i 
       LEFT JOIN saldofinalprodutositens sfi 
              ON i.id = sfi.iditemvalor 
                 AND Isnull(sfi.datahoraexclusao, '') = '' 
                 and sfi.idSaldoFinalProduto IN (SELECT id FROM saldoFinalProdutos WHERE idmovimentodiario = 76)
       LEFT JOIN saldoinicialprodutositens sii 
              ON i.id = sii.iditemvalor 
                 AND Isnull(sii.datahoraexclusao, '') = '' 
                 and sii.idSaldoInicialProduto IN (SELECT id FROM saldoInicialProdutos WHERE idmovimentodiario = 76)